我们想使用两个 QualifierFilters 过滤 HBase 表上的扫描。
意味着我们只想获取表中确实具有特定列“col_A”的行AND(!) 某个其他列“col_B”。
我们当前的方法如下所示:
FilterList filterList = new FilterList(FilterList.Operator.MUST_PASS_ALL);
Filter filter1 = new QualifierFilter(CompareOp.EQUAL, new BinaryComparator("col_A".getBytes()));
filterList.addFilter(filter1);
Filter filter2 = new QualifierFilter(CompareOp.EQUAL, new BinaryComparator("col_B".getBytes()));
filterList.addFilter(filter2);
Scan scan = new Scan();
scan.setFilter(filterList);
...
尽管 HBase 表中有几行同时包含“col_A”和“col_B”列,但 ResultScanner 不会从该扫描返回任何结果。
如果我们仅将 filter1 应用于扫描,则一切正常,并且我们确实获得了具有“col_A”的所有行。
如果我们只将filter2应用于扫描,它是相同的。我们确实获得了所有具有“col_B”的行。
只有将这两个过滤器结合起来,我们才不会得到任何结果。
仅从表中获取具有 col_A 和 col_B 的行的正确方法是什么?
您可以通过定义以下过滤器来实现此目的:
List<Filter> filters = new ArrayList<Filter>(2);
byte[] colfam = Bytes.toBytes("c");
byte[] fakeValue = Bytes.toBytes("DOESNOTEXIST");
byte[] colA = Bytes.toBytes("col_A");
byte[] colB = Bytes.toBytes("col_B");
SingleColumnValueFilter filter1 =
new SingleColumnValueFilter(colfam, colA , CompareOp.NOT_EQUAL, fakeValue);
filter1.setFilterIfMissing(true);
filters.add(filter1);
SingleColumnValueFilter filter2 =
new SingleColumnValueFilter(colfam, colB, CompareOp.NOT_EQUAL, fakeValue);
filter2.setFilterIfMissing(true);
filters.add(filter2);
FilterList filterList = new FilterList(FilterList.Operator.MUST_PASS_ALL, filters);
Scan scan = new Scan();
scan.setFilter(filterList);
这里的想法是定义一个SingleColumnValueFilter
您正在寻找的每列,每列都有一个假值和一个CompareOp.NOT_EQUAL
操作员。 IE:
这样的 SingleColumnValueFilter 将返回给定名称的所有列。
Source: http://mapredit.blogspot.com/2012/05/using-filters-in-hbase-to-match-two.html http://mapredit.blogspot.com/2012/05/using-filters-in-hbase-to-match-two.html
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)