Hbase行键设计(行键设计(rowkey)实现多条件查询)实现多条件查询
2018最新编辑
HBASE的使用跟业务逻辑有很强的关联性,就像本文里提到的例子使用ElasticSearch更合适。HBASE适合那种使用key-
value模式的快速查询,多字段查询还是不适合它。
所以大家如果看本文的话,就全当是加深对hbase过滤器的理解吧,内容概括起来就是实现一个使用位运算的比较器。
摘要
本文主要内容是通过合理hbase 行键(rowkey)设计实现快速的多条件查询,所采用的方法将所有要用于查询中的列经过一些
处理后存储在rowkey中,查询时通过rowkey进行查询,提高rowkey的利用率,加快查询速度。行键(rowkey)并不是简单的
把所有要查询的列的值直接拼接起来,而是将各个列的数据转成整型(int)数据来存储。之后实现两个自定义的比较器
(comparator):一个是相等比较器,用于实现类似于SQL的多条件精确查找功能。
另一个是范围比较器,用于实现类似于SQL语句
这样的范围查找功能。
当两个比较器配合使用再结合hbase的过滤器,以实现类似于下面这条SQL语句这样多条件的查询
问题背景
hbase 作为开源列式存储,使用起来与传统的关系型数据库还是有很多不同的。就以我所在公司为例,下面的数据是一些网页
连通性的数据,
每行json字符串都表示某一条网址的连通性扫描信息,部分需要检索的json属性的意义如下
1.md5url url的md5的值
2.status 扫描状态
3.code http访问返回码
4.sdate 扫描日期
5.sitecode 所属站点
6.type 扫描类型
7.free 是否收费
8.close 是否关闭
9.queue 等待队列
10.scantype 扫描类型
其实我们不需要知道其每个属性都代表什么意思,我们只需要知道我们在查询的时候有可能会用到上述一个或多个属性,例如
查询某一条URL在某一天的扫描数据 SQL表示
或者是我们要查询某一天连不通的网址(返回码是404)
或者查询某个URL在过去某几天内的数据
以上只是简单列举几种查询的需求,实际生产中会有更多种累的查询需求,那如何设计hbase 表结构就成为解决问题的关键。
行键(rowkey)设计
根据问题需求,我们看到需要查询的属性多达10个,如果说查询每一个属性的值时都使用columnvaluefilter 的话那速度是相当
慢的,hbase 需要去进行全表的扫描’满山遍野’地找与你值相匹配的行,而且使用columnvaluefileter也很难实现一次查找中放
入多个找找条件(PS:也许是我理解不够深入啊,不懂如何使用columnvaluefileter 通过一次scan可以得到多列都满足要求的
数据,这里暂且不谈。)。既然全表扫描的这种方式被否定,那怎么样解决这个问题?关键就在于行键(rowkey)
rowkey设计有以下几个原则(http://www.cnblogs.com/kxdblog/p/4328699.html)
1、长度越短越好
2、唯一性
评论0
最新资源