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结束的数据。