更新时间:2024-08-03 GMT+08:00

使用Filter过滤器读取HBase数据

功能简介

HBase Filter主要在Scan和Get过程中进行数据过滤,通过设置一些过滤条件来实现,如设置RowKey、列名或者列值的过滤条件。

代码样例

以下代码片段在com.huawei.bigdata.hbase.examples包的“HBaseSample”类的testSingleColumnValueFilter方法中。

public void testSingleColumnValueFilter() {
    LOG.info("Entering testSingleColumnValueFilter.");
    Table table = null;

    ResultScanner rScanner = null;

    try {

      table = conn.getTable(tableName);

      Scan scan = new Scan();
      scan.addColumn(Bytes.toBytes("info"), Bytes.toBytes("name"));
      // Set the filter criteria.
      SingleColumnValueFilter filter = new SingleColumnValueFilter(
          Bytes.toBytes("info"), Bytes.toBytes("name"), CompareOperator.EQUAL,
          Bytes.toBytes("Xu Bing"));
      scan.setFilter(filter);
      // Submit a scan request.
      rScanner = table.getScanner(scan);
      // Print query results.
       for (Result r = rScanner.next(); r != null; r = rScanner.next()) {
         for (Cell cell : r.rawCells()) {
           LOG.info("{}:{},{},{}", Bytes.toString(CellUtil.cloneRow(cell)),
               Bytes.toString(CellUtil.cloneFamily(cell)), Bytes.toString(CellUtil.cloneQualifier(cell)),
               Bytes.toString(CellUtil.cloneValue(cell)));
        }
      }
      LOG.info("Single column value filter successfully.");
    } catch (IOException e) {
      LOG.error("Single column value filter failed " ,e);
    } finally {
        if (rScanner != null) {
            // Close the scanner object.
            rScanner.close();
          }
      if (table != null) {
        try {
          // Close the HTable object.
          table.close();
        } catch (IOException e) {
          LOG.error("Close table failed " ,e);
        }
      }
    }
    LOG.info("Exiting testSingleColumnValueFilter.");
  }

注意事项

当前二级索引不支持使用SubstringComparator类定义的对象作为Filter的比较器。

例如,如下示例中的用法当前不支持:

Scan scan = new Scan();
filterList = new FilterList(FilterList.Operator.MUST_PASS_ALL);
filterList.addFilter(new SingleColumnValueFilter(Bytes
.toBytes(columnFamily), Bytes.toBytes(qualifier),
CompareOperator.EQUAL, new SubstringComparator(substring)));
scan.setFilter(filterList);