hbase过滤器应用-and跟or的简单实现

  • 1.运算符

< LESS

<= LESS_OR_EQUAL

= EQUAL

!= NOT_EQUAL

>= GREATER_OR_EQUAL

> GREATER

排除所有 NO_OP

  • 2.过滤器组FilterList可利用过滤器组,实现sql中,and跟or的模式

//MUST_PASS_ALL必须通过所有过滤器

FilterList filterList = new FilterList(FilterList.Operator.MUST_PASS_ALL, qualifierFilter, qualifierFilter1);

//MUST_PASS_ONE只需通过一个过滤器

FilterList or = new FilterList(FilterList.Operator.MUST_PASS_ONE);

  • 代码片段
 /**
     * get的方式取rowkey
     * @param tableName
     * @param type
     * @param ids
     * @param starttime
     * @param endtime
     * @return
     */
    public JSONArray getResultByTsAndIdGet(String tableName, String type, String[] ids, long starttime, long endtime) {
        try {
            Table table = HbaseConnect.getTable(tableName);
            List<Get> gets = new ArrayList<>();
            long startHour = starttime - starttime % 3600;
            long endHour = endtime - endtime % 3600 ;
            Filter qualifierFilter = new QualifierFilter(CompareFilter.CompareOp.GREATER_OR_EQUAL
                    , new BinaryComparator(Bytes.toBytes(String.valueOf(starttime))));
            QualifierFilter qualifierFilter1 = new QualifierFilter(CompareFilter.CompareOp.LESS_OR_EQUAL
                    , new BinaryComparator(Bytes.toBytes(String.valueOf(endtime))));
            //过滤器组:and的模式
            FilterList filterList = new FilterList(FilterList.Operator.MUST_PASS_ALL, qualifierFilter, qualifierFilter1);
            for (; startHour <= endHour; startHour+=3600) {
                for (String id : ids) {
                    String rowKey = type+"_"+ startHour+"_"+id;
                    Get get = new Get(rowKey.getBytes());
                    get.setFilter(filterList);
                    gets.add(get);
                }
            }
            Result[] results = table.get(gets);
            JSONArray resultList = new JSONArray();
            for (Result result : results) {
                List<KeyValue> list = result.list();
                if(list==null){
                    continue;
                }
                list.stream().forEach(kv -> {
                    resultList.add(JSON.parseObject(new String(kv.getValue())));
                });
            }
            table.close();
            return resultList;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }


    /**
     * scan的方式取,速度比较慢
     * @param tableName
     * @param type
     * @param ids
     * @param starttime
     * @param endtime
     * @return
     */
    public JSONArray getResultByTimestampAndId(String tableName, String type, String[] ids, long starttime, long endtime) {

        // 按rowkey的前缀过滤
//            Filter prefixFilter=new PrefixFilter(Bytes.toBytes("1_"));
        //按列的值过滤,'>='并且'<='
        Filter qualifierFilter = new QualifierFilter(CompareFilter.CompareOp.GREATER_OR_EQUAL
                , new BinaryComparator(Bytes.toBytes(String.valueOf(starttime))));
        QualifierFilter qualifierFilter1 = new QualifierFilter(CompareFilter.CompareOp.LESS_OR_EQUAL
                , new BinaryComparator(Bytes.toBytes(String.valueOf(endtime))));
        //正则匹配id--过滤器组:or模式
        FilterList or = new FilterList(FilterList.Operator.MUST_PASS_ONE);
        for (String id : ids) {
            RowFilter rowFilter = new RowFilter(CompareFilter.CompareOp.EQUAL,
                    new RegexStringComparator(".*" + id + "$"));
            or.addFilter(rowFilter);
        }
        //过滤器组:and模式
        FilterList filterList = new FilterList(FilterList.Operator.MUST_PASS_ALL, qualifierFilter, qualifierFilter1, or);
        ResultScanner results = HbaseUtil.getScannerFilter(tableName,
                getStartKey(type, starttime),
                getEndKey(type, endtime),
                filterList);
        JSONArray resultList = new JSONArray();
        results.forEach(result -> {
            List<KeyValue> list = result.list();
            list.stream().forEach(kv -> {
                resultList.add(JSON.parseObject(new String(kv.getValue())));
            });
        });
        return resultList;
    }

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值