关于通过Python读取hbase里面的数据通过row_prefi前缀的方式读取数据的方式
业务介绍:
最近在做将线上的日志数据 通过flink的形式消费过来 ,然后灌入hbase 表当中。然后最近要解析这个日志想通过Python的方式读取hbase的日志进行解析 然后入库的方式做。
我们想一个小时做一次 但是那个rowkey 设计的真是卧槽。一点业务理念都没有 就是简单的字符串拼接起来的。只能通过fliter的形式过滤rowkey 然后把数据拿到。真是蛋疼。
所以只能重新设计rowkey,然后将实时的数据接入到我们的系统。
图中的rowkey是之前别人设计的,我想一个小时拿一次 这可咋整啊。真是无语了。
所以就想着能不能改一下rowkey的形式。然后为了保证不出现数据热点和数据的唯一性。重新设计rowkey
我重新设计通过每天的小时数,然后还有年月日时分秒的形式,再加上这条数据的hash值。然后作为rowkey
具体的python代码如下:
#! /root/anaconda3/bin/python3 # coding:utf-8 import happybase import datetime,time connection = happybase.Connection('自己集群的ip') connection = happybase.Connection('自己集群的ip', autoconnect=False) connection.open() print(connection.tables()) table = connection.table('app') print(table) #因为这里是美国时间,所以要获取的时间减8个小时,同时因为时获取的是前一个小时的数据 ,所以这里需要减去9个小时 today_str = (datetime.datetime.now() + datetime.timedelta(hours=-9)).strftime('%Y-%m-%d %H:%M:%S') #这里获取的是小时的标识符2019080506 这里就截取06作为要处理的小时数据 today_time=today_str[11:13] today = today_str[0:4] + today_str[5:7] + today_str[8:10] print(today_time) print(today) today_time_pingjie=today_time+"|"+today #这里需要对rowkey的前缀进行编码转化 today_time_byte = bytes(today_time_pingjie, encoding = "utf8") for key, data in table.scan(row_prefix=today_time_byte): print(key, data)
注意:
这里通过 row_prefix 的形式获取到rowkey中我们想要的行数据。这里一定要注意将其转化为字节。字符串会出现下面的报错
Traceback (most recent call last):
File "F:/softinstall/Python/pythonworkplace/readhbasedata/hbase.py", line 27, in <module>
for key, data in table.scan(row_prefix='05'):
File "F:\softinstall\Python\pythonworkplace\venv\lib\site-packages\happybase\table.py", line 341, in scan
row_stop = bytes_increment(row_prefix)
File "F:\softinstall\Python\pythonworkplace\venv\lib\site-packages\happybase\util.py", line 82, in bytes_increment
assert isinstance(b, six.binary_type)
AssertionError
官网的代码如下:
https://happybase.readthedocs.io/en/latest/
这个代码当中有一个b 百度上漫天飞的都没加这个 死活查询不到数据。