python hbase 字符串_Python 读写 hbase 数据的正确姿势(一)

本文介绍了使用Python的happybase库批量导入HBase数据时遇到的filter过滤问题。通过对比Python和Java写入数据的差异,发现Python将整型数据直接转换为字符串存储,导致Java客户端使用bytes类型的filter无法正确过滤。解决方案是将整型数据通过`struct.pack`转为big-endian的bytes存储和过滤,确保跨语言兼容性。
摘要由CSDN通过智能技术生成

title: Python 读写 hbase 数据的正确姿势(一)

tags:

hbase

happybase

python

categories:

�Hbase

comments: true

date: 2017-09-09 19:00:00

之前操作 hbase 大都是用 java 写,或者偶尔用 python 写几个一些简单的 put、get 操作。最近在使用 happybase 库批量向 hbase 导入数据,并通过 java 实现查询的一些复杂的搜索时(scan+filter),遇到了一些有趣的问题。

实验版本

Hbase 版本:1.0.0

Happybase 版本:1.1.0

Python 版本:2.7.13

问题1:filter 过滤失败

问题重现

hbase 的使用场景大概是这样的:

有一个 hbase table,存储一些文章的基本信息,包括创建时间、文章ID、文章类别ID等,同属于一个column family,"article"。

查询的场景则是查找"指定的时间范围","文章类型ID为N" 的所有文章数据。

根据以上场景,设计如下 table:

hbase table 为 article 。

rowkey 是 "ARTICLE" + 微秒级时间戳(类似OpenTSDB 的rowkey,便于按时间序列查到某一段时间创建的 articles),即 "ARTICLE1504939752000000"。

family 为 "basic",包含 "ArticleID", "ArticleTypeID", "Created", 三个 column。

查询时通过指定 rowkey start 和 rowkey stop,可以 scan 某一个时间段的数据(因为 rowkey 中包含数值型的时间戳),通过 hbase filter 实现"ArticleTypeID" == N 的过滤条件。

开始导入数据、准备查询,以下是导入数据部分代码 demo:

def save_batch_events(datas, table=None):

with get_connetion_pool().connection() as conn:

if table is not None:

t = conn.table(table)

else:

t = conn.table(TABLE)

b = t.batch(transaction=False)

for row, data in datas.items():

b.put(row, data)

b.send()

def save_main_v1():

datas = dict()

for i in range(100):

article_type_id = i % 2

timestamp = time.time() + i<

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值