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'])