分享

关于hbase的rowkey设计及查询

zeus_lhl 发表于 2016-7-30 02:28:31 [显示全部楼层] 只看大图 回帖奖励 阅读模式 关闭右栏 5 19655
现在需要通过三个条件,到hbase里去查询数据,date,cond1,cond2,为了查询快速,rowkey设置为 'date_cond1_cond2',
现在有个问题,如果我不需要其中某一个条件,只需要date和cond1两个条件去查询,通过操作hbase的java API,进行过滤后的模糊查询,查询的速度会不会降低?
如果不会,那比如我有5个条件,只要把rowkey设置为‘cond1_cond2_cond3_cond4_cond5’,等需要其中某几个条件进行查询时候,只要filter过滤一下,就可以实现了。
如果速度会降低,那是不是针对每个查询条件,我都要设置一个新的rowkey组合?比如上面的例子,我是不是要另外建一张表,然后把rowkey设置为‘date_cond1’
,然后到另外一张表中去查,但这个时候表中数据几乎完全一致,只有rowkey有差别,这岂不是资源浪费很厉害

请大神指点,最好是针对上面的情况,详细点说,不要给个连接了事,兄弟初学,谢过!

已有(6)人评论

跳转到指定楼层
langke93 发表于 2016-7-30 14:17:44
只需要改变一个观念即可。
hbase表与二级索引表,他们的数据是不一样的。
比如hbase表:rowkey学号+姓名
学生表
rowkey                col
20080609张三    成绩:英语52;语文100
                           班级:一年级一班


20080610李四   成绩:英语85;语文95
                           班级:一年级二班


假如我们按照学号和姓名查询都是可以通过rowkey来查询的。
但是如果通过班级来查询就不成了,所以这时候就通过二级索引表来查询

索引表如下:

key                      value

一年级一班          20080609张三
一年级二班          20080610李四

我们通过二级索引表,查询一年一班,对应的rowkey是 20080609张三
然后通过rowkey  20080609张三迅速定位到hbase表中的记录。


所以索引表和原表二者是有本质区别的。


点评

赞,了解处理方法了  发表于 2016-7-30 14:31
回复

使用道具 举报

zeus_lhl 发表于 2016-7-30 14:34:16
langke93 发表于 2016-7-30 14:17
只需要改变一个观念即可。
hbase表与二级索引表,他们的数据是不一样的。
比如hbase表:rowkey学号+姓名
...

按照兄台的例子,我一开始如果建立hbase表的rowkey为 学号_姓名_班级,不就可以了,反正通过学号,或者姓名,或者 姓名_班级 组合,任何一个子组合去查询,速度都不会降低。那还用索引表吗?
再极端一些,比如我有十个条件,其中的一个或者几个条件,都有可能是我们要查询的组合,那我十个条件组合成一个rowkey作为hbase的rowkey不就可以了吗?
那索引表就派不上用场了

回复

使用道具 举报

desehawk 发表于 2016-7-30 15:09:41
本帖最后由 desehawk 于 2016-7-30 15:10 编辑
zeus_lhl 发表于 2016-7-30 14:34
按照兄台的例子,我一开始如果建立hbase表的rowkey为 学号_姓名_班级,不就可以了,反正通过学号,或者姓 ...

这里需要了解rowkey的设计原则:
1.越短越好

2.如果过长,暂用太多的内存

详细如下:

Rowkey长度原则,Rowkey是一个二进制码流,Rowkey的长度被很多开发者建议说设计在10~100个字节,我的建议是越短越好,不要超过16个字节。

原因一数据的持久化文件HFile中是按照KeyValue存储的,如果Rowkey过长比如100个字节,1000万列数据光Rowkey就要占用100*1000万=10亿个字节,将近1G数据,这会极大影响HFile的存储效率;

原因二MemStore将缓存部分数据到内存,如果Rowkey字段过长内存的有效利用率会降低,系统将无法缓存更多的数据,这会降低检索效率。因此Rowkey的字节长度越短越好。

原因三目前操作系统是都是64位系统,内存8字节对齐。控制在16个字节,8字节的整数倍利用操作系统的最佳特性。


回复

使用道具 举报

zeus_lhl 发表于 2016-7-30 23:22:53
desehawk 发表于 2016-7-30 15:09
这里需要了解rowkey的设计原则:
1.越短越好

谢谢二位
回复

使用道具 举报

easthome001 发表于 2016-7-31 13:21:35

华为二级索引跟二楼差不多,不过还是有点区别的,如下图

1.png


也就是说rowkey截取了一部分,然后直接把查询的咧放入到value中。这样效率会更高一些。
比如rowkey中,只取学号,然后value放入班级,采用下面方式

key                      value

20080609            一年级一班
20080610            一年级二班





回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条