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;
    }

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章