我想使用过滤器进行 hbase 扫描。例如,我的表有 A、B、C 列族,A 有 X 列。有些行有 X 列,有些没有。如何实现过滤器以过滤掉所有具有 X 列的行?
3 回答
我猜你正在 HBase 中寻找SingleColumnValueFilter
。如API中所述
如果在行上找不到列,要防止发出整行,请
setFilterIfMissing(boolean)
在 Filter 对象上使用。否则,如果找到该列,则仅当值通过时才会发出整行。如果该值失败,则该行将被过滤掉。
但是SingleColumnValueFilter
希望一个值具有 Column X "CompareOp" 的东西,说如果 ColumnX == "X" 则带上这一行,或者如果 ColumnX != "A sentinel value that ColumnX can never take" 并且setFilterIfMissing(true)
如果 ColumnX 有一些值,它被返回。
我希望这能让你朝着正确的方向前进。
您可以将SkipFilter与ColumnPrefixFilter一起使用。ColumnPrefixFilter 获取列存在的键(HBase 行只有在有值时才会有列) Skip 过滤器会在第一个过滤器上为您提供“Not”,因此将省略该行
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 构造它无法满足要求。