【问题标题】:HBase addColumn and setFilterHBase addColumn 和 setFilter
【发布时间】:2016-02-28 03:42:18
【问题描述】:

我正在通过仅使用我想要的特定列名和使用列过滤器的列范围设置 Scanner 来扫描 HBase。

添加单独的行:

known_fields.forEach(known_field ->scanner.addColumn("x".getBytes(), known_field.getBytes()));

我还要添加一个列过滤器:

scanner.setFilter(new ColumnRangeFilter(start, true, stop, true));

所有变量都有正确的值。我正在扫描如下

    scanner.setCacheBlocks(false);
    scanner.setBatch(1000);

    ResultScanner results = null;
    Table table = null;
    try {
        table = connection.getTable("table_test");
        results = table.getScanner(scanner);
        boolean hasPerformed;
        for (final Result result : results) {
        ...

results 始终为空。但是,如果我注释掉scanner.setFilter(new ColumnRangeFilter(start, true, stop, true));scanner.addColumn(,结果就很好了。它不适用于组合。

如何实现已知列和范围列的组合?

【问题讨论】:

  • 你可以在这个帖子里找到答案:groups.google.com/forum/#!topic/nosql-databases/IZHkQl169Hw
  • @maxteneff:谢谢。但是解决方案是完全删除 addColumn,因为在该用例中 addColumn 属性是 ColumnRange 的一部分。我的用例不同。我需要使用Scan,而不是Get

标签: java hadoop hbase bigdata


【解决方案1】:

如果scanner.addColumn 的列数较少,则可以将FilterListMUST_PASS_ONE 运算符一起使用,并将ColumnRangeFilter 传递给它。添加要扫描的列在这种情况下等同于添加具有重合开始和结束列的 ColumnRangeFilter。例如

Filter filter = new FilterList(FilterList.Operator.MUST_PASS_ONE);
known_fields.forEach(known_field -> 
      filter.addFilter(new ColumnRangeFilter(known_field.getBytes(), true, 
                                             known_field.getBytes(), true));
filter.add(new ColumnRangeFilter(start, true, stop, true));
scan.setFilter(filter);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-19
    • 2021-08-31
    • 1970-01-01
    • 2017-03-23
    • 1970-01-01
    • 2012-09-12
    • 1970-01-01
    • 2016-04-08
    相关资源
    最近更新 更多