分享

hbase hash散列后 如何scan 查询?

tanxl 2017-3-3 11:37:26 发表于 疑问解答 [显示全部楼层] 回帖奖励 阅读模式 关闭右栏 7 25296
我HBase表的行键设计:散列字段-id-time,共24个字
(4个字节,int转byte数组)-(4个字节字符串)-(14个字节字符串,如20140823115240)

当我要scan某一range的记录,我该如何过滤掉行键的头4个字节,让行键匹配从id字段开始呢。

假如我要查询id=0111号终端在2014年5月1号到2014年6月1号之间的记录,我该如何设定scansetStartRowsetStopRow的参数值。

已有(7)人评论

跳转到指定楼层
easthome001 发表于 2017-3-3 14:00:12
获取时间段可以使用setTimeRange函数。
scan.setTimeRange

回复

使用道具 举报

arsenduan 发表于 2017-3-3 14:45:05
如果说只是单纯的hbase,可以办到,但是性能是个问题。所以我们需要结合其它技术,比如hbase二级索引或则solr.
有的使用正则表达式,取后缀,但是这个没有尝试过,感觉也不是什么好的解决方案。
这里单纯从hbase的角度来解决:
使用SingleColumnValueFilter来解决:
思路:查询id=0111,然后添加上时间范围
使用了FilterList ,filter ,SingleColumnValueFilter

FilterList filterList=new FilterList();  

Filter filter = new SingleColumnValueFilter(  
Bytes.toBytes("列簇"),
Bytes.toBytes("id"),
CompareOp.EQUAL, Bytes.toBytes("0111"));  

    SingleColumnValueFilter filter1 =  new  SingleColumnValueFilter(
                Bytes. toBytes ( "列簇" ),
                Bytes. toBytes ( "time" ),
                CompareOp. GREATER_OR_EQUAL ,
                Bytes. toBytes ( "2014年5月1号" )

                );

        SingleColumnValueFilter filter2 =  new  SingleColumnValueFilter(
                Bytes. toBytes ( "列簇" ),
                Bytes. toBytes ( "time" ),
                CompareOp. LESS_OR_EQUAL ,
                Bytes. toBytes ( "2014年6月1号" )

                );
添加条件
filterList.addFilter(filter1);
filterList.addFilter(filter2);

filterList.addFilter(filter);  
scan.setFilter(filterList);  

回复

使用道具 举报

tanxl 发表于 2017-3-3 15:21:37
arsenduan 发表于 2017-3-3 14:45
如果说只是单纯的hbase,可以办到,但是性能是个问题。所以我们需要结合其它技术,比如hbase二级索引或则so ...

您好,你这个完全没使用到rowke 呀 ,全是去查的family:qualify,这样应该很慢吧;
重点是rowkey设计了就完全没用了!

回复

使用道具 举报

easthome001 发表于 2017-3-3 16:45:44
本帖最后由 easthome001 于 2017-3-3 16:47 编辑
tanxl 发表于 2017-3-3 15:21
您好,你这个完全没使用到rowke 呀 ,全是去查的family:qualify,这样应该很慢吧;
重点是rowkey设计了 ...


使用RowFilter,楼主可以试试
提取rowkey以123开头的数据
Filter filter = new RowFilter(CompareFilter.CompareOp.EQUAL,new BinaryPrefixComparator("0111".getBytes()));


Filter filter1 = new RowFilter(CompareFilter.CompareOp.GREATER_OR_EQUAL,new SubstringComparator("2014年5月1号"));

Filter filter2 = new RowFilter(CompareFilter.CompareOp.LESS_OR_EQUAL,new SubstringComparator("2014年6月1号"));

filterList.addFilter(filter1);
filterList.addFilter(filter2);

filterList.addFilter(filter);  
scan.setFilter(filterList);  
上面的含义:通过过滤rowkey
首先可以找到0111的,然后在找大于2014年5月1号小于2014年6月1号
当然时间需要改成数字,上面伪代码



回复

使用道具 举报

tanxl 发表于 2017-3-3 18:40:59
easthome001 发表于 2017-3-3 16:45
使用RowFilter,楼主可以试试
提取rowkey以123开头的数据
Filter filter = new RowFilter(CompareFil ...

@easthome001  3q , CompareFilter.CompareOp.EQUAL,new BinaryPrefixComparator("0111".getBytes()) 会从rowkey开头开始匹配,匹配出的结果会是rowkey=0111* 的所有数据 。

回复

使用道具 举报

easthome001 发表于 2017-3-3 19:50:42
tanxl 发表于 2017-3-3 18:40
@easthome001  3q , CompareFilter.CompareOp.EQUAL,new BinaryPrefixComparator("0111".getBytes()) 会 ...

Filter filter = new RowFilter(CompareFilter.CompareOp.EQUAL,new SubstringComparator("0111".getBytes()));


回复

使用道具 举报

zstu 发表于 2017-11-24 09:27:28
easthome001 发表于 2017-3-3 16:45
使用RowFilter,楼主可以试试
提取rowkey以123开头的数据
Filter filter = new RowFilter(CompareFil ...

权威指南里面说SubtringComparator只能与equal和not_equal运算符搭配
回复

使用道具 举报

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

本版积分规则

关闭

推荐上一条 /2 下一条