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

来源:互联网 发布:js产生随机数的函数 编辑:程序博客网 时间:2024/06/05 22:32

最近在做大数据分析结果的展示。宗旨:存进去,取出来,看似简单其实不易。经过这几天的不懈努力终于找到了中上等的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则是你所要取的数据的个数(从大到小)。

希望能帮助到大家~~(有不明白的地方或者错误/建议欢迎留言指出)

0 0
原创粉丝点击