hbase2.1.x java SingleColumnValueFilter 过滤,多条件查询

多条件过滤

关键代码

通过下面代码,将多个 filter 组合起来:

FilterList fl=new FilterList(FilterList.Operator.MUST_PASS_ALL,startFilter,endFilter);

解释:

  • FilterList.Operator.MUST_PASS_ALL 相当于 SQL 中的 and
  • FilterList.Operator.MUST_PASS_ONE 相当于 SQL 中的 or

完整代码

/**
 * @param tableName
 * @param columnFamily1    第一个条件的列族名
 * @param column1          第一个条件的列名
 * @param op1              第一个条件的操作符
 * @param value1           第一个条件的值
 * @param filterIfMissing1 第一个条件的filterIfMissing,true 表示没有列值,认为不满足条件;false,没有列值,也满足条件
 * @param columnFamily2    第二个条件的列族名
 * @param column2          第二个条件的列名
 * @param op2              第二个条件的操作符
 * @param value2           第二个条件的值
 * @param filterIfMissing2 第二个条件的filterIfMissing,true 表示没有列值,认为不满足条件;false,没有列值,也满足条件
 * @return
 * @throws IOException
 */
public List<CellData[]> filter(String tableName,
                               String columnFamily1, String column1, String op1, String value1, boolean filterIfMissing1,
                               String columnFamily2, String column2, String op2, String value2, boolean filterIfMissing2) throws IOException {
    Table table = conn.getTable(TableName.valueOf(tableName));
    //创建Scan
    Scan scan = new Scan();
    SingleColumnValueFilter startFilter = new SingleColumnValueFilter(
            Bytes.toBytes(columnFamily1),
            Bytes.toBytes(column1),
            getCompareOperator(op1),
            new BinaryComparator(Bytes.toBytes(value1))); // 注意是字符串
    startFilter.setFilterIfMissing(filterIfMissing1);
    SingleColumnValueFilter endFilter = new SingleColumnValueFilter(
            Bytes.toBytes(columnFamily2),
            Bytes.toBytes(column2),
            getCompareOperator(op2),
            new BinaryComparator(Bytes.toBytes(value2))); // 注意是字符串
    endFilter.setFilterIfMissing(filterIfMissing2);
    //构建过滤list,MUST_PASS_ALL 相当于 sql 中的 and
    FilterList fl = new FilterList(FilterList.Operator.MUST_PASS_ALL, startFilter, endFilter);
    //传入FilterList
    scan.setFilter(fl);
    //执行scan
    ResultScanner resultScanner = table.getScanner(scan);
    Iterator<Result> iterator = resultScanner.iterator();
    List<CellData[]> retList = new ArrayList<>();
    //迭代,在迭代时,ResultScanner会发送get请求
    while (iterator.hasNext()) {
        Result result = iterator.next();
        //获取rowkey
        String rowkey = Bytes.toString(result.getRow());
//            System.out.print(rowkey+"\t");
        //获取所有单元格
        List<Cell> list = result.listCells();
        CellData[] arr = new CellData[list.size()];
        int i = 0;
        for (Cell item : list) {
            String family = Bytes.toString(CellUtil.cloneFamily(item));
            String qualifier = Bytes.toString(CellUtil.cloneQualifier(item));
            String valueDb = Bytes.toString(CellUtil.cloneValue(item));
            CellData cellData = new CellData(family, qualifier, rowkey, item.getTimestamp(), valueDb);
            arr[i] = cellData;
            i++;
        }
        retList.add(arr);
    }
    //用完要及时关闭,在迭代时,ResultScanner会发送get请求
    resultScanner.close();
    table.close();
    return retList;
}

测试

public static void main(String[] args) throws IOException {
    HbaseUtils2_filter2 utils = new HbaseUtils2_filter2();
    utils.connect();
    // 查询 price 小于等于 099.90的数据
    List<CellData[]> resList = utils.filter("book",
            "c1", "price", ">=", "059.00", true,
            "c1", "price", "<=", "099.90", true);
    for (CellData[] arr : resList) {
        for (CellData item : arr) {
            System.out.print(item.getFamily() + ":" + item.getRowkey() + ":" + item.getQualifier() + " == " + item.getValue() + "\t\t");
        }
        System.out.println();
    }
    utils.close();
}

原文出处:https://malaoshi.top/show_1IX4THecDSfj.html