我想用过滤器进行hbase扫描。例如,我的表有列系列 A、B、C,A 有列 X。有些行有 X 列,有些没有。如何实现过滤器以过滤掉带有 X 列的所有行?
我猜你正在寻找HBase中的SingleColumnValueFilter
。如 API 中所述
若要防止在行上找不到列时发出整行,请使用 Filter 对象上的
setFilterIfMissing(boolean)
。否则,如果找到该列,则仅当值传递时,才会发出整行。如果该值失败,则将筛选出该行。
但是SingleColumnValueFilter
希望一个值将 X 列"比较"到某些东西,比如说如果 ColumnX == "X"或如果 ColumnX != "ColumnX 永远无法获取的哨兵值"并setFilterIfMissing(true)
,则带上此行,以便如果 ColumnX 具有某个值,则返回该行。
我希望这能把你推向正确的方向。
您可以使用 SkipFilter 和 ColumnPrefixFilter。列前缀筛选器获取列所在的键(HBase 行只有在有值的情况下才会有列)跳过筛选器将在第一个筛选器上为您提供"Not",因此该行将被省略
Ankit Arnon user1573269
我能让它工作的唯一方法如下
所以 - 我有一个带有列规则 1、规则 2、规则 3 等的表。行只能有规则 1 列、规则 1 和规则 2、规则 1 和规则 2 和规则 3 等。说 - 我想提取其中只有规则 1 的行。现在这意味着,我将不得不跳过包含 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 将跳过那些不满足条件的方法。因此,从列前缀筛选器构造它不符合要求。