happyhbase 基本操作和增量操作

  • 创建连接(Connection)

    非自动连接:

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

    自动连接:

    connection = happybase.Connection('somehost') #自动连接

    指定以后所涉及的表实际都是以指定前缀开头的(当然前缀后还有个'_'):

    connection = happybase.Connection('somehost', table_prefix='myproject')
  • 访问表格(Table)

  • 连接(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_versionblock_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_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
 

 

 

 

 

转载于:https://my.oschina.net/u/1458120/blog/543073

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值