更新時間:2023-03-16 來源:黑馬程序員 瀏覽量:
HBase數(shù)據模型是一個多維稀疏映射。 HBase中的表包含列族,其列限定符包含值和時間戳。在大多數(shù) HappyBase API 中,列族和限定符名稱被指定為單個字符串,例如cf1:col1,而不是作為兩個單獨的參數(shù)。雖然列族和限定符在 HBase 數(shù)據模型中是不同的概念,但它們在與數(shù)據交互時幾乎總是一起使用,因此將它們視為單個字符串會使 API 變得更簡單。
Table 類提供了多種方法來從 HBase 中的表中檢索數(shù)據。最基本的是 Table.row(),它從表中檢索單行,并將其作為映射列到值的字典返回:
row = table.row(b'rk0001') print(row[b'info:name']) # prints the value of info:name # 返回值:b'zhangsan',注意是二進制<class 'bytes'>類型 # 轉換字符串: print(str(row[b'info:name'], encoding="utf-8")) # 即 str(bytes對象, encoding="編碼格式,通常使用utf-8")
> 注意,庫中的字符串都有前綴:b,表示二進制
> 如:print(type(row[b'info:name']))
> 返回值:
Table.rows() 方法的工作方式與 Table.row() 類似,但需要多個行鍵并將它們作為 (key, data) 元組返回:
rows = table.rows([b'rk0001', b'rk0002']) for key, data in rows: print(key, data) """ 返回值: b'rk0001' {b'data:pic': b'picture', b'info:age': b'20', b'info:gender': b'female', b'info:name': b'zhangsan'} b'rk0002' {b'data:pic': b'picture', b'info:age': b'11', b'info:gender': b'male', b'info:name': b'wangwu'} 注意哦,key是bytes對象 data是字典對象,字典中key和value都是bytes
如果您希望 Table.rows() 作為字典或有序字典返回的結果,您必須自己執(zhí)行此操作。不過這真的很簡單,因為返回值可以直接傳遞給字典構造函數(shù)。對于普通字典,順序丟失:
rows_dict = dict(table.rows([b'rk0001', b'rk0002'])) # 返回值: """ 字典: {b'rk0001': {b'data:pic': b'picture', b'info:age': b'20', b'info:gender': b'female', b'info:name': b'zhangsan'}, b'rk0002': {b'data:pic': b'picture', b'info:age': b'11', b'info:gender': b'male', b'info:name': b'wangwu'}} """
而對于 OrderedDict,順序被保留:
from collections import OrderedDict rows_as_ordered_dict = OrderedDict(table.rows([b'rk0002', b'rk0001'])) """ 返回值: OrderedDict([(b'rk0002', {b'data:pic': b'picture', b'info:age': b'11', b'info:gender': b'male', b'info:name': b'wangwu'}), (b'rk0001', {b'data:pic': b'picture', b'info:age': b'20', b'info:gender': b'female', b'info:name': b'zhangsan'})]) """
HBase 的數(shù)據模型允許對要檢索的數(shù)據進行更細粒度的選擇。如果您事先知道需要哪些列,則可以通過將這些列明確指定給 Table.row() 和 Table.rows() 來提高性能。 columns 參數(shù)采用列名的列表(或元組):
row = table.row(b'rk0001', columns=[b'info:name', b'data:pic']) # row對象類型字典,內容:{b'data:pic': b'picture', b'info:name': b'zhangsan'} print(row[b'info:name']) print(row[b'data:pic']) """ 返回值:bytes類型,需要的話自行轉字符串 b'zhangsan' b'picture'
如果檢索一整個列族中的所有列(二級列)。例如,要獲取列族 info中的所有列和值,請使用以下命令:
row = table.row(b'rk0001', columns=[b'info']) print(type(row)) print(row) """ 返回值: <class 'dict'> {b'info:age': b'20', b'info:gender': b'female', b'info:name': b'zhangsan'} """
在 HBase 中,每個單元都有一個附加的時間戳。如果您不想使用存儲在 HBase 中的最新版本數(shù)據,則可以使用從數(shù)據庫中檢索數(shù)據的方法,例如Table.row() 都接受一個時間戳參數(shù),該參數(shù)指定結果應限制為時間戳不超過指定時間戳的值:
row = table.row(b'rk0001', timestamp=123456789)
默認情況下,HappyBase 在返回的結果中不包含時間戳。在您的應用程序需要訪問時間戳時,只需將 include_timestamp 參數(shù)設置為 True?,F(xiàn)在,結果中的每個單元格都將作為(值,時間戳)元組返回,而不僅僅是一個值:
row = table.row(b'rk0001', columns=[b'info'], include_timestamp=True) print(type(row)) print(row) """ 返回值: <class 'dict'> {b'info:age': (b'20', 1641832837038), b'info:gender': (b'female', 1641832832414), b'info:name': (b'zhangsan', 1641832826093)} """
HBase 支持存儲同一單元的多個版本。這可以為每個列族配置。要檢索給定行的列的所有版本,可以使用 Table.cells()。此方法返回一個有序的單元格列表,最新版本排在最前面。版本參數(shù)指定要返回的最大版本數(shù)。就像檢索行的方法一樣,include_timestamp 參數(shù)確定時間戳是否包含在結果中。例子:
# 首先,準備一個保存多版本的表 create 'tv', {NAME => 'info', VERSIONS => 5} # 插入版本1 put 'tv', 'rk0001', 'info:name', 'hahaha' # 插入版本2 put 'tv', 'rk0001', 'info:name', 'heiheihei' # 檢查 hbase(main):024:0> scan 'tv' ROW COLUMN+CELL rk0001 column=info:name, timestamp=1641836267655, value=heiheihei 1 row(s) Took 0.0103 seconds
table = connection.table('tv') # 獲取1個版本(默認最新咯) values = table.cells(b'rk0001', b'info:name', versions=1) print(type(values)) print(values) """ 返回值: <class 'list'> [b'heiheihei'] """ # 獲取2個版本 values = table.cells(b'rk0001', b'info:name', versions=2) print(type(values)) print(values) """ 返回值: <class 'list'> [b'heiheihei', b'hahaha'] 可見,2個版本都獲取了,按照順序,第一個最新 """ # 獲取多版本并附帶時間戳信息 values = table.cells(b'rk0001', b'info:name', versions=2, include_timestamp=True) print(type(values)) print(values) """ 返回值: <class 'list'> [(b'heiheihei', 1641836267655), (b'hahaha', 1641836263534)] """