非自動鏈接:python
connection = happybase.Connection('somehost', autoconnect=False) connection.open()
自動鏈接:數組
connection = happybase.Connection('somehost') #自動鏈接
指定之後所涉及的表實際都是以指定前綴開頭的(固然前綴後還有個'_'):app
connection = happybase.Connection('somehost', table_prefix='myproject')
鏈接(Connection)提供的方法:spa
connection.tables()
# 獲取表格列表code
connection.create_table(
'mytable',
{'cf1': dict(max_versions=10),
'cf2': dict(max_versions=1, block_cache_enabled=False),
'cf3': dict(), # use defaults
}) # 第二個參數是個 map<string, map>
的結構,內層的 map
用於設置建立的列的參數配置對象
table = connection.table('mytable') # 獲取表對象
這個方法不會檢查表格是否存在,也就是在用 table
的某些方法的時候纔會出現異常,建立表,能夠帶上一些參數如:max_version
、block_cache_enables
。字符串
注意!由於 hbase
是多個產品功能的,因此表的命名最好跟應用相關,否則容易衝突,推薦用 classfoo_page
這種get
表格(Table)提供的方法:
經過 key 獲取一行的信息:
row = table.row('row-key')
獲取指定 family:colum 的值
print row['cf1:col1'] 獲取一個列簇下全部列 print row['cf1']
獲取多行數據:
for key, data in rows: print key, data rows_as_dict = dict(table.rows(['row-key-1', 'row-key-2']))
獲取多行有序 map
:
from collections import OrderedDict rows_as_ordered_dict = OrderedDict(table.rows(['row-key-1', 'row-key-2']) # 將 rows 方法返回的 key、value 存入 map 或者放入有序 map
獲取指定列的數據(默認狀況下。row
或者 rows
方*獲取行的全部列(而大多數的列,在這些相應的業務處理的時候都是用不到的,因此能夠指定獲取那些 column
,減小傳輸數據的大小):
print row['cf1:col1'] print row['cf1:col2'] row = table.row('row-key', timestamp=123456789) # 同時能夠指定時間片信息,可是請注意必定得是數字(>=0),不能夠是字串 row = table.row('row-key', columns=['cf1:col1'], include_timestamp=True) value, timestamp = row['cf1:col1'] rows = table.rows(['h1', 'h5', 'h3'], include_timestamp=True) #對於include_timestamp也能夠用於rows方法 for key, value in rows: print key, value # 而其返回的結果相似一個map,key爲相應的row_key,value也爲map,不過其值不光是value還有value對應的時間片,組成了一個數組,注意rows方法
獲取多版本的信息:
values = table.cells('row-key', 'cf1:col1', versions=2) for value in values: print "Cell data: %s" % value cells = table.cells('row-key', 'cf1:col1', versions=3, include_timestamp=True) for value, timestamp in cells: # 通常都這格式,value帶時間片的,都是先value,在時間片的數組 print "Cell data at %d: %s" % (timestamp, value)
表格遍歷:
print key, data
這裏 key 就收 row_key
,value 爲一整行的數據,都是 map
,key 爲 famliy:colname
形式,和 row
方法或者 row
方法返回的 value
值是同樣的,能夠在 scan
參數中指定 row_start='class'
或者 row_end='foo'
,用於限定範圍,同事支持row_key
的前端匹配,經過 row_prefix
。
數據存儲(傳入給 hbase
的數據都是原始的字節字符串):
table.put('row-key', {'cf:col1': 'value1'}, timestamp=123456789) # 能夠手動加入時間片,注意必定是integer的
批量存儲:
b = table.batch(timestamp=123456789) b.put( ...) # 這裏的timestamp能夠不指定,也能夠在put的時候指定 b.send()
或者是與 with
集合,能起到即便有異常拋出,仍會進行 b.send()
的操做,不過從某種角度,這就不是一個完整的transation
了:
with table.batch() as b: b.put('row-key-1', {'cf:col1': 'value1', 'cf:col2': 'value2'}) b.put('row-key-2', {'cf:col2': 'value2', 'cf:col3': 'value3'}) b.put('row-key-2', {'cf:col2': 'value2', 'cf:col3': 'value3'}) b.put('row-key-3', {'cf:col3': 'value3', 'cf:col4': 'value4'}) # 注意 put 和 delet 操做能夠放在一個 batch 裏頭,可是對同一行執行 put 和 delete 操做,放到一個 batch 裏頭其表現是不可預測b.send()
固然由於須要插入多條數據或者數據自己很大,倒數數據量會很到,這時候就須要設置 batch
的大小,以作優化:
with table.batch(batch_size=1000) as b: for i in range(1200): b.put('row-%04d' % i, {'cf1:col1': 'v1','cf1:col2': 'v2',}) # 這裏也是能夠 put 多個列的,用 map。特別須要注意的是在 batch 裏頭 transaction=True, batch_size=1000,這兩個屬性是不能同時使用的
刪除數據:
table.delete('row-key') table.delete('row-key', columns=['cf1:col1', 'cf1:col2'])
table.put table.row table.rows 原則上只適用於value是字符串的存儲
增量操做:value是int的存儲
table.counter_inc('rowkey', 'activetime:201603019')#增長1
table.counter_inc('rowkey', 'activetime:201603019',value=4)#增長4
b=table.counter_get('rowkey', 'activetime:201603019')#print 5
table.counter_get只適用於獲取一行一列,但在實際應用中每每須要獲取一行多列(例如 獲取某個用戶天天的活躍時間,以用戶名爲rowkey,activetime爲列簇,日期爲列名,輸入username一次性獲取一個月的數據),這個時候counter_get就不適用了,但我又必須用counter_inc增量存儲,這時請選擇一下方式取數:
table.counter_inc('buyid-gyf', 'activetime:201603015') table.counter_inc('buyid-gyf', 'activetime:201603016',value=4) a=table.counter_get('buyid-gyf', 'activetime:201603015') b=table.counter_get('buyid-gyf', 'activetime:201603016') print a,b #3,12 rows = table.row('buyid-gyf', ['activetime:201603015','activetime:201603016']) print rows {'activetime:201603015': '\x00\x00\x00\x00\x00\x00\x00\x03', 'activetime:201603016': '\x00\x00\x00\x00\x00\x00\x00\x0c'} 用table.row 取多列時輸出原始hbase存儲的字節流 import struct for i,j in rows.items(): print i,struct.unpack('>Q',j)[0] #struct的用法請參照個人python目錄中的structactivetime:201603015 3 activetime:201603016 12