展开

python连接hbase

最后发布时间 : 2024-01-30 13:39:48 浏览量 :

https://happybase.readthedocs.io/en/latest/user.html
https://github.com/ukwa/docker-hbase-standalone/blob/master/Dockerfile

docker run -d \
    -p 41189:41189 \
    -p 2181:2181 \
    -p 60000:60000 \
    -p 60010:60010 \
    -p 60020:60020 \
    -p 60030:60030 \
    -p 9091:9090 \
    -h hbase-srv \
    cogniteev/hbase-standalone
hbase-daemon.sh start thrift
import happybase
connection = happybase.Connection('10.110.1.11', port=9091)
print(connection.tables())

[]

connection.create_table(
    'mytable',
    {'cf1': dict(max_versions=10),
     'cf2': dict(max_versions=1, block_cache_enabled=False),
     'cf3': dict(),  # use defaults
    }
)
print(connection.tables())

[b'mytable']

新建表

创建表一个名为student2的表,包含五个属性(即列族)Sname、Ssex、Sage、Sdept和course

connection.create_table(
    'student2',
    {
        'Sname': dict(max_versions=10),
        'Ssex': dict(),
        'Sage': dict(),
        'Sdept': dict(),
        'course': dict()
    }
)

添加数据

要操作已经创建的表,则先获取其table实例

ts=connection.table('student2')

添加主键(默认,可视为学号)为95001,名字(Sname列族)为YangXing的一行数据——注意所有输入都必须是字符串

ts.put(row='95001',data={'Sname:':'YangXing','course:math':'90'})

注意即使没有列限定符冒号也不能省(如上面的“Sname:”),这点和shell操作HBase不同。
put方法每输入一行都要和HBase通信一次,如果想多行一次性批量写入HBase可以使用batch

bat = ts.batch()
bat.put(row='95001',data={'course:english':'82'})
bat.put(row='93020',data={'Sname:':'WeiLiu','course:math':'87'})
bat.send()

为方便可利用上下文管理器with/as实现

with ts.batch() as bat:
    bat.put(row='95001',data={'course:english':'82'})
    bat.put(row='93020',data={'Sname:':'WeiLiu','course:math':'87'})

查看数据

这里介绍三种方法:row、rows和scan。功能不同,酌情使用。

row

如果想获取一行的数据,如行号95001

ts.row('95001')

{b'Sname:': b'YangXing', b'course:english': b'82', b'course:math': b'90'}

如果想获取某行的某列族,如行号95001的course列族(注意course后不能加冒号,即输出此列族的所有列限定符内容。)

ts.row(row='95001',columns=['course'])

{b'course:english': b'82', b'course:math': b'90'}

如果想获取某行的某列族的某列限定符内容,如行号95001的course列族的english列

ts.row(row='95001',columns=['course:english'])

{b'course:english': b'82'}

另外,可以通过设定来显示时间戳

ts.row(row='95001',columns=['course:english'],include_timestamp=True)

{b'course:english': (b'82', 1706592478990)}

注意columns只能传入list或tuple,如[course]或(course,)。

rows

可使用rows来获取多行

ts.rows(rows=['95001','93020'])

[(b'95001',
{b'Sname:': b'YangXing', b'course:english': b'82', b'course:math': b'90'}),
(b'93020', {b'Sname:': b'WeiLiu', b'course:math': b'87'})]

也可指定列族

ts.rows(rows=['95001','93020'],columns=['course'])

[(b'95001', {b'course:english': b'82', b'course:math': b'90'}),
(b'93020', {b'course:math': b'87'})]

甚至列限定符

ts.rows(rows=['95001','93020'],columns=['course:math'])

[(b'95001', {b'course:math': b'90'}), (b'93020', {b'course:math': b'87'})]

同row一样,rows也可以设置include_timestamp=True来显示时间戳。

scan

如果想遍历整个表的所有内容

for key,value in ts.scan():
    print(key,value)

b'93020' {b'Sname:': b'WeiLiu', b'course:math': b'87'}
b'95001' {b'Sname:': b'YangXing', b'course:english': b'82', b'course:math': b'90'}

也可设置起始行键(行键的顺序由系统自动排列)

for key,value in ts.scan(row_start='95001'):
    print(key,value)

b'95001' {b'Sname:': b'YangXing', b'course:english': b'82', b'course:math': b'90'}

或终止行键

for key,value in ts.scan(row_stop='95001'):
    print(key,value)

b'93020' {b'Sname:': b'WeiLiu', b'course:math': b'87'}

也可以row_start和row_stop同时设定,注意是前闭后开区间。
同row一样,scan也可以设置include_timestamp=True来显示时间戳。

删除数据

使用delete命令删除某行的若干列族/列数据。注意delete命令会删除所有历史数据(类似于shell的deleteall)。
删除一整行,如93020行

ts.delete(row='93020')

执行后93020这行的所有数据(包括任何列的所有历史版本)都被删除
删除某行某列族,如95001行的course列族

ts.delete(row='95001',columns=['course'])

注意course后面没有冒号
删除某行某列族某列,如95001行的course列族的english列

ts.delete(row='95001',columns=['course:english'])

https://www.jianshu.com/p/ec4eb315b5cb