happyhbase 基本操做和增量操做

  • 建立鏈接(Connection)前端

    非自動鏈接:python

    connection = happybase.Connection('somehost', autoconnect=False)
    connection.open()

    自動鏈接:數組

    connection = happybase.Connection('somehost') #自動鏈接

    指定之後所涉及的表實際都是以指定前綴開頭的(固然前綴後還有個'_'):app

    connection = happybase.Connection('somehost', table_prefix='myproject')
  • 訪問表格(Table)優化

  • 鏈接(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_versionblock_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_keyvalue 爲一整行的數據,都是 mapkey 爲 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
相關文章
相關標籤/搜索