hbase2.1.x java RowFilter rowkey过滤器

上接:hbase2.1.x java 创建工程

说明

RowFilter 是用来对 rowkey 进行过滤的

比较符

可以使用比较符(不支持符号,需要用英文单词),如下:

Operator Description
LESS 小于
LESS_OR_EQUAL 小于等于
EQUAL 等于
NOT_EQUAL 不等于
GREATER_OR_EQUAL 大于等于
GREATER 大于
NO_OP 排除所有

比较器

参见 链接

例子

关键方法

/**
 *
 * @param tableName 表名
 * @param family 列族名
 * @param column 列名
 * @param startRow,指定开始的rowkey(包含)。如果不设置,则从表头开始
 * @param stopRow,指定结束的rowkey(不包含)。如果不设置,则截止的末尾
 * @param op 操作,=,>,>=,<,<=,!=
 * @param rowComparator 比较器
 * @throws IOException
 */
public List<CellData[]> filter(
        String tableName,
        String family,
        String column,
        String startRow,
        String stopRow,
        String op,
        ByteArrayComparable rowComparator) throws IOException {
    Table table = conn.getTable(TableName.valueOf(tableName));

    //创建Scan
    Scan scan=new Scan();

    // 返回指定的 family、column,不指定表示返回所有
    if(column!=null && !"".equals(column)) {
        scan.addColumn(Bytes.toBytes(family), Bytes.toBytes(column));
    }

    // 返回指定的 family,不指定表示返回所有
    if(family!=null && !"".equals(family) && (column==null || "".equals(column))) {
        scan.addFamily(Bytes.toBytes(family));
    }

    // 指定开始的行(包含)。如果不设置,则从表头开始
    if(startRow!=null && !"".equals(startRow)) {
        scan.withStartRow(Bytes.toBytes(startRow));
    }

    // 指定结束的行(不包含)。如果不设置,则截止的末尾
    if(stopRow!=null && !"".equals(stopRow)) {
        scan.withStopRow(Bytes.toBytes(stopRow));
    }

    RowFilter filter = new RowFilter(getCompareOperator(op),rowComparator);

    //传入filter
    scan.setFilter(filter);
    //执行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 familyOfDb=Bytes.toString(CellUtil.cloneFamily(item));
            String qualifier=Bytes.toString(CellUtil.cloneQualifier(item));
            String valueDb=Bytes.toString(CellUtil.cloneValue(item));
            CellData cellData = new CellData(familyOfDb,qualifier,rowkey,item.getTimestamp(),valueDb);
            arr[i] = cellData ;
            i ++ ;
        }
        retList.add(arr);
    }
    //用完要及时关闭,在迭代时,ResultScanner会发送get请求
    resultScanner.close();
    table.close();
    return retList;
}

比较符号转枚举方法

// 传入 =,>,>=,<,<=,!=,返回相对应的 CompareOperator
CompareOperator getCompareOperator(String op){
    CompareOperator co = null;
    switch (op) {
        case "=":
            co = CompareOperator.EQUAL;
            break;
        case ">":
            co = CompareOperator.GREATER;
            break;
        case ">=":
            co = CompareOperator.GREATER_OR_EQUAL;
            break;
        case "<":
            co = CompareOperator.LESS;
            break;
        case "<=":
            co = CompareOperator.LESS_OR_EQUAL;
            break;
        case "!=":
            co = CompareOperator.NOT_EQUAL;
            break;
        default:
            co = CompareOperator.NO_OP;
    }
    return co;
}

测试

public static void main(String[] args) throws IOException {
    HbaseUtils2_RowFilter utils=new HbaseUtils2_RowFilter();
    utils.connect("hadoop1,hadoop2,hadoop3","2181");
    // XXX 关键:二进制比较器,查询 rowkey 大于 1002 的数据 XXX
    BinaryComparator comparator = new BinaryComparator(Bytes.toBytes("1002"));
    List<CellData[]> resList = utils.filter("book", "c1", null,null,null,
            ">", comparator);

    for(CellData[] arr : resList){
        for(CellData item : arr){
            System.out.println(item.getFamily()+":"+item.getRowkey()+":"+item.getQualifier() +" == "+item.getValue());
        }
        System.out.println("----------");
    }
    utils.close();
}

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