Python通过happybase操作HBase数据库

1、安装

与Java可以直接操作HBase数据库不同,python需要借助thrift完成对hbase数据库的操作。

Thrift是Facebook公布的一款开源跨语言的RPC框架,而RPC (Remote Procedure Call Protocal),远程过程调用协议是指在一台机器上调用另一台机器上进程的协议,这样在客户端通过thrift调用分布式HBase进程从而完成相关操作。

通过yum完成thrift安装,并查看版本号

yum install thrift -y
thrift --version

接着启动hbase的thrift进程,并指定运行在9091端口

hbase/bin/hbase-daemon.sh start thrift -p 9091

最后安装python相关依赖

pip install thrift
pip install happybase

2、使用happybase

连接

通过Connection()获取连接对象

    conn = happybase.Connection(host='10.109.252.82',   # 主机名
                                port=9091,              # 端口
                                timeout=None,           # 超时时间
                                autoconnect=True,       # 是否自动打开连接
                                table_prefix=None,      # 数据表名称前缀
                                table_prefix_separator=b'_',
                                compat='0.98',          # 兼容模式
                                transport='buffered',   # 运输模式
                                protocol='binary')      # 协议

如果没有设置自动打开连接,则需要通过open()close()手动打开/关闭连接

conn.open()
conn.close()

通过create_table()可以创建数据表my_table,并指定三个列簇及其属性

conn.create_table(
    'my_table',
    {
        'cf1': dict(max_versions=10),
        'cf2': dict(max_versions=1, block_cache_enabled=False),
        'cf3': dict(),  # use defaults
    }
)

获取所有数据表名

table_name_list = connection.tables()

获取某个数据表

table = connection.table(name,user_prefix=True)

启动/禁用数据表

connection.enable_table(name)
connection.disable_table(name)

删除数据表

connection.delete_table(name,disable=False)

数据表

获取数据表happybase.Table对象,

table = happybase.Table(name,connection)

写入数据

通过put()可以插入一条数据,put(row, data, timestamp=None, wal=True)

table.put()方法会立即给Hbase Thrift server发送一条命令。这种方法的效率并不高,可以使用table.batch()批量进行操作。batch将数据保存在内存中,直到数据被send,第一种是显示地发送,即bat.send(),第二种是到达with上下文管理器的结尾自动发送。这样万一数据量很大,就会占用太多的内存。所以我们在使用table.batch()的时候可以通过batch_size参数来设置batch的大小

# 插入一条数据
table.put("1001",{"info:name":"Jack"})

# 使用batch一次插入多行数据
bat = table.batch()
bat.put('www.test5.com', {'cf1:price': 999, 'cf2:title': 'Hello Python', 'cf2:length': 34, 'cf3:code': 'A43'})
bat.put('www.test6.com', {'cf1:content': u'剃须刀', 'cf1:price': 168, 'cf1:rating': '97%'})
bat.put('www.test7.com', {'cf3:function': 'print'})
bat.send()

# 通过with管理batch
with table.batch(batch_size=10) as bat:
    for i in range(16):
        bat.put('www.test{}.com'.format(i), {'cf1:price': '{}'.format(i)})

查询数据

通过cells()获取具体某一行的某一个列中具体一个单元格的数据,cells(row, column, versions=None, timestamp=None, include_timestamp=False),

  • row:行
  • column:列
  • versions:获取的最大版本数量,默认None,即获取所有
  • timestamp:获取小于此时间戳版本的所有数据,默认None,所有
  • include_timestamp:是否返回时间戳,默认False
row1=table.cells('1001','info:name')

通过row()可以dic形式返回获取的一行数据,row(row, columns=None, timestamp=None, include_timestamp=False),可以使用column指定获取的数据列,或者通过时间戳timestamp来检索数据:

  • row:键值
  • columns: 列名,默认为None,即获取所有列,可传入一个list或tuple来指定获取列
  • timestamp:获取小于此时间戳版本的所有数据,默认None,所有
  • include_timestamp:是否返回时间戳数据,默认为False

如果希望同时查询多行数据可以使用rows()传入多个键值,返回的是对应的数据list列表

# 检索多行数据,返回有序字典
from collection import OrderedDict
rows_ordered_dict = OrderedDict(table.rows(['1001', '1002']))
print rows_ordered_dict

通过scan()完成对整个表的扫描,scan(row_start=None, row_stop=None, row_prefix=None, columns=None, filter=None, timestamp=None, include_timestamp=False, batch_size=1000, scan_batching=None, limit=None, sorted_columns=False, reverse=False):

  • row_start:从哪一行开始,默认None,即第一行
  • row_stop:到哪一行之前结束,默认None最后一行
  • row_prefix:行号前缀,默认为None,可传入前缀来扫描符合此前缀的行
  • columns:列,默认为None,即获取所有列,可传入一个list或tuple来指定获取列
  • filter:过滤字符串
  • timestamp:时间戳。获取小于此时间戳的最大时间戳的版本数据
  • include_timestamp:是否返回时间戳数据,默认为False
  • batch_size:用于检索结果的批量大小
  • scan_batching:服务端扫描批处理
  • limit:数量
  • sorted_columns:是否返回排序的列(根据行名称排序)
  • reverse:是否执行反向扫描
for key, value in table.scan(row_start='1001', row_stop='1010'):
    print key, value

删除数据

delete()删除,

# 删除一整行数据
table.delete('1001')
# 删除一个列族的数据
table.delete('1001', columns=['info'])
# 删除一个列族中几个列的数据
table.delete('1001', columns=['info:name', 'info:age'])

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值