6

我想使用过滤器进行 hbase 扫描。例如,我的表有 A、B、C 列族,A ​​有 X 列。有些行有 X 列,有些没有。如何实现过滤器以过滤掉所有具有 X 列的行?

4

3 回答 3

13

我猜你正在 HBase 中寻找SingleColumnValueFilter。如API中所述

如果在行上找不到列,要防止发出整行,请setFilterIfMissing(boolean)在 Filter 对象上使用。否则,如果找到该列,则仅当值通过时才会发出整行。如果该值失败,则该行将被过滤掉。

但是SingleColumnValueFilter希望一个值具有 Column X "CompareOp" 的东西,说如果 ColumnX == "X" 则带上这一行,或者如果 ColumnX != "A sentinel value that ColumnX can never take" 并且setFilterIfMissing(true)如果 ColumnX 有一些值,它被返回。

我希望这能让你朝着正确的方向前进。

于 2012-10-12T18:39:40.987 回答
1

您可以将SkipFilterColumnPrefixFilter一起使用。ColumnPrefixFilter 获取列存在的键(HBase 行只有在有值时才会有列) Skip 过滤器会在第一个过滤器上为您提供“Not”,因此将省略该行

于 2012-10-13T16:00:40.370 回答
0

Ankit Arnon 用户1573269

我可以让它工作的唯一方法,如下所示

所以 - 我有一个包含 rule1、rule2、rule3 等列的表格。行只能有 rule1 列,或者 rule1 和 rule2,或者 rule1 和 rule2 和 rule3 等等。说 - 我想提取其中只有 rule1 的行。现在这意味着,我将不得不跳过其中包含 rule2 的行。

Scan getRules = new Scan();
    ColumnPrefixFilter rule1Filter = new ColumnPrefixFilter(Bytes.toBytes("rule1"));
    SingleColumnValueFilter skipRule2Value = new      SingleColumnValueFilter(Bytes.toBytes("rules"),Bytes.toBytes("rule2"),
    CompareOp.EQUAL,Bytes.toBytes("0"));
    SkipFilter skipRule2 = new SkipFilter(skipRule2Value);
    getRules.setFilter(rule1Filter);
    getRules.setFilter(skipRule2);
    ResultScanner scanner = htable.getScanner(getRules);

虽然这行得通,但我对解决方案不是很满意。hbase 需要时间来弄清楚。我原以为应该有一种更简单直接的方法,不必检查值。Arnon,您的方法不起作用,因为 SkipFilter 将跳过那些不满足条件的方法。因此,从 ColumnPrefixFilter 构造它无法满足要求。

于 2013-08-05T15:38:15.193 回答