-
非自动连接:
connection = happybase.Connection('somehost', autoconnect=False) connection.open()
自动连接:
connection = happybase.Connection('somehost') #自动连接
指定以后所涉及的表实际都是以指定前缀开头的(当然前缀后还有个'_'):
connection = happybase.Connection('somehost', table_prefix='myproject')
-
连接(Connection)提供的方法:
-
connection.tables()
# 获取表格列表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
这种表格(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