我想用过滤器进行hbase扫描。例如,我的表有列族A,B,C,而A有一列X.有些行有X列,有些则没有。如何实现过滤器以过滤掉列X的所有行?
答案 0 :(得分:11)
我猜你在HBase中寻找SingleColumnValueFilter
。如API
要防止在行上找不到列时发出整行,请在Filter对象上使用
setFilterIfMissing(boolean)
。否则,如果找到该列,则仅在值通过时才会发出整行。如果值失败,则该行将被过滤掉。
但是SingleColumnValueFilter
会想要一个值让列X“CompareOp”到某个东西,比如说如果ColumnX =“X”则带这个行
要么
如果ColumnX!=“ColumnX永远不会采用的哨兵值”和setFilterIfMissing(true)
,请将此行带到此行,以便如果ColumnX具有某个值,则返回该行。
我希望这能使你朝着正确的方向前进。
答案 1 :(得分:1)
您可以使用SkipFilter和ColumnPrefixFilter。 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构造它不符合要求。