Hbase查询小结:先缩小范围,再使用正则进行过滤

最近在做大数据分析结果的展示。宗旨:存进去,取出来,看似简单其实不易。经过这几天的不懈努力终于找到了中上等的hbase key的设计方式。 
key的设计:时间+类型一+类型二+(long的最大值-此条数据的value)+…… 
查询代码:

/**
* 根据startRowKey和endRowKey筛选出区间,然后根据regxKey正则匹配和num查出最终的结果
* @param tableName 表名
* @param startRowKey 开始的范围
* @param endRowKey 结束的范围
* @param regxKey 正则匹配
* @param num 查询的条数
* @return List<Result>
*/
public List<Result> getNumRegexRow(String tableName,String startRowKey,String endRowKey, String regxKey,int num) {
        HTableInterface table = null;
        List<Result> list = null;
        try {
            table = hTablePool.getTable(tableName) ;
            //创建一个过滤器容器,并设置其关系(AND/OR)
                FilterList fl = new FilterList(FilterList.Operator.MUST_PASS_ALL);
            //设置正则过滤器
            RegexStringComparator rc = new RegexStringComparator(regxKey);
            RowFilter rf = new RowFilter(CompareOp.EQUAL, rc);
            //过滤获取的条数
            Filter filterNum = new PageFilter(num);//每页展示条数
            //过滤器的添加
            fl.addFilter(rf);
            fl.addFilter(filterNum);
            Scan scan = new Scan();
            //设置取值范围
            scan.setStartRow(startRowKey.getBytes());//开始的key
            scan.setStopRow(endRowKey.getBytes());//结束的key
            scan.setFilter(fl);//为查询设置过滤器的list
            ResultScanner scanner = table.getScanner(scan) ;
            list = new ArrayList<Result>() ;
            for (Result rs : scanner) {
                list.add(rs) ;
            }
        } catch (Exception e) {
            e.printStackTrace() ;
        }
        finally
        {
            try {
                table.close() ;

            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return list;
    }

 

进行测试举例:

List<Result> list = hbaseUtil.getNumRegexRow("student","201611241440vmhardware.disk.read.bps","201611241440vmhardware.disk.read.bpsA","201611241440vmhardware\\.disk\\.read\\.bps.*",100);

 

原理: 
①hbase会根据key值进行默认排序,所以我们的数据会按先照时间排序,然后再按照类型一排序,再按照类型二排序,再按照value从大到小(你应该懂得~~)的方式排序。 
②范围201611241440vmhardware.disk.read.bps到201611241440vmhardware.disk.read.bpsA是因为A比任意一个数字都大 
③201611241440vmhardware\.disk\.read\.bps.*代表你要根据需求拼成的正则表达式 
④100则是你所要取的数据的个数(从大到小)。

转载于:https://my.oschina.net/u/3346994/blog/1923980

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值