HBase資料庫與關係型資料庫的區別(取材於官方文件)
HBase 資料被建模為多維對映,其中值(表單元)通過 4 個鍵索引:
value = Map(TableName, RowKey, ColumnKey, Timestamp)
其中:
TableName 是一個字串。 是表名。
RowKey 和 ColumnKey 是二進位制值(Java 型別 byte[])。 代表行健和列族。
Timestamp 是一個 64 位整數(Java 型別 long)。
value 是一個未解釋的位元組陣列(Java™ 型別 byte[])。
二進位制資料被編碼為 Base64,以便通過網路傳輸。
行鍵是表的主鍵,通常是一個字串。行通過行鍵按字典順序排序。
儲存在表中的資訊的結構為列族(column family,就相當於列名),您可以將這種結構視為類別。每個列族可以擁有任意數量的成員,它們通過標籤(或修飾符)識別。column 鍵(就是每列的值)由族名、:號和標籤組成。例如,對於系列name 和成員 first,列鍵為 name: first。
(這裡不是很好理解,看了下面的圖可能就比較容易理解了,這個跟資料庫有區分,可見,這裡一行,不代表就一組資料,往往是多組資料的,一個rowkey可能對應多列的值,而每列的值(可以視為columnkey)是由列族名:標籤組成),又如,name:last也是一個成員,他們都在於00001行鍵上,是00001行鍵的成員,成員值,就是
一個 HBase 表模式定義多個列族,但當您向表中插入一行時,應用程式能夠在執行時建立新成員。對於一個列族,表中的不同行可以擁有不同數量的成員。換句話說,HBase 支援一個動態模式 模型。
參考下圖更好理解
其實這些記錄在hbase是根據TimeStamp排序的,所以這雖然上圖看起來很工整,但是實際上載資料庫裡存放是凌亂的。000001和000002的成員交錯著放,唯一定義一個成員的唯一值的行鍵+列族:標籤。
以第一個成員為例:
000001是行鍵,列族是name和contact,列鍵(column鍵)是name:first 和name:last和contact:http ,Value值就是
對於任意行,一次只能訪問一個列族的一個成員(這與關係資料庫不同,在關係資料庫中,一個查詢可以訪問來自一個行中的多個列的單元)。您可以將一個行中的一個列族的成員視為子行。(這個是因為一行可以對應多組成員所定,跟資料庫最大的不同在於此吧)
表被分解為多個表區域,等同於 Bigtable 片(tablet)。一個區域包含某個範圍中的行。將一個表分解為多個區域是高效處理大型表的關鍵機制。