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

时间:2012-10-12 12:23:02

标签: filter null hbase out

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

3 个答案:

答案 0 :(得分:11)

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

中所述
  

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

但是SingleColumnValueFilter会想要一个值让列X“CompareOp”到某个东西,比如说如果ColumnX =“X”则带这个行 要么 如果ColumnX!=“ColumnX永远不会采用的哨兵值”和setFilterIfMissing(true),请将此行带到此行,以便如果ColumnX具有某个值,则返回该行。

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

答案 1 :(得分:1)

您可以使用SkipFilterColumnPrefixFilter。 ColumnPrefixFilter获取列存在的键(如果HBase行有值,则HBase行只有一列)Skip过滤器将在第一个过滤器上显示“Not”,因此该行将被省略

答案 2 :(得分:0)

Ankit Arnon user1573269

我能让它发挥作用的唯一方法就像下面的

所以 - 我有一个包含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构造它不符合要求。