关于通过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 百度上漫天飞的都没加这个 死活查询不到数据。

 

posted on 2020-04-03 18:03  gxg123  阅读(1133)  评论(0编辑  收藏  举报

导航