hbase 根据需求创建组合索引(组合rowkey)及组合索引创建规则

来源:互联网 发布:php beast 解密 编辑:程序博客网 时间:2024/05/16 09:30

hbase据我目前的了解来看 《查询》方面的最大优势是根据rowkey 进行查询,然后结合map/reduce 运算效率非常高,但是如果牵扯到表关联查询,涉及到列簇中的列时,因为没有索引效率就变的非常低下,所以我这采用了组合索引(组合rowkey)方式来解决这个问题,下面采用简单的例子来说明如何创建,及创建组合rowkey时需要注意的问题。


关系数据库用户表:user

user_id           name

1                       raymond1

2                       raymond2

3                       raymond3


关系数据库用户文章列表ariticle:

article_id         content                user_id

1                       有才                      1

2                       帅哥                      1

3                       奥特man              2

4                       no凹凸man         2


最简单的一个业务需求:查询出某个用户发表所有文章

在关系型数据库解决非常简单,在article表的user_id创建索引,大数据量下效率也没问题,但是hbase下如果按照这个结构,创建article表

article_id 作为rowkey,user_id作为列簇中的列,这时候程序用hbase扫描器scanner进行user_id的扫描就有问题了,因为现在的版本是不支持在列上创建索引的,我现在的解决办法,主键用user_id,article_id 组合方式,

结构如下 user_id+_+article_id

hbase 里article结构如下

rowkey         col1

1_1              有才

1_2              帅哥 

1_3              奥特man

2_4              no凹凸man  

扫描user_id 为1的用户文章,可以通过如下一句设置

Scan scan = new Scan(Bytes.toBytes("1_1"), Bytes.toBytes("1_9"));

来使扫描器定位出1用户所有文章


我曾经担心下见面的rowkey使用Scan scan = new Scan(Bytes.toBytes("1_1"), Bytes.toBytes("1_9"))会有问题

1_1

1_11
1_111

但是经测试发现担心是多余的,scan会自动匹配所有已 1_1 开始1_9结束的数据。




       


原创粉丝点击