7

我们想用两个 QualifierFilters 过滤 HBase 表上的扫描。意味着我们只想获取表中确实具有某个列“col_A”(!)某个其他列“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 的行的正确方法?

4

2 回答 2

3

我认为这条线是问题所在 -

FilterList filterList = new FilterList(FilterList.Operator.MUST_PASS_ALL);

你希望它是——

FilterList filterList = new FilterList(FilterList.Operator.MUST_PASS_ONE);

过滤器将尝试查找同时具有列限定符且不存在此类列的列

于 2014-03-17T21:37:58.367 回答
3

您可以通过定义以下过滤器来实现此目的:

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运算符。即:这样的 SingleColumnValueFilter 将返回给定名称的所有列。

来源: http: //mapredit.blogspot.com/2012/05/using-filters-in-hbase-to-match-two.html

于 2012-11-18T21:59:24.947 回答