如何过滤掉具有给定列(非空)的行



我想用过滤器进行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 将跳过那些不满足条件的方法。因此,从列前缀筛选器构造它不符合要求。

相关内容

  • 没有找到相关文章

最新更新