How do I mix MUST_PASS_ALL and MUST_PASS_ONE in HB

2019-07-11 07:38发布

问题:

I have an HBase scan with a ColumnPrefixFilter and multiple FuzzyFilters like so:

FilterList filterList = new FilterList();
filterList.addFilter(new FuzzyFilter(...));
filterList.addFilter(new FuzzyFilter(...));
filterList.addFilter(new ColumnPrefixFilter(...));
Scan s = new Scan();
s.setFilter(filterList);

Is there a way I can use MUST_PASS_ONE on the FuzzyFilters and then a MUST_PASS_ALL on the ColumnPrefixFilter combined with the set of FuzzyFilters?

So I'm looking for something like this:

ColumnPrefixFilter AND (FuzzyFilter OR FuzzyFilter)

回答1:

We can implement two different FilterList to acheive this. Refer the below code

    FilterList mainFilter = new FilterList(FilterList.Operator.MUST_PASS_ALL);
    FilterList subFilter = new FilterList(FilterList.Operator.MUST_PASS_ONE);

    subFilter.addFilter(new FuzzyRowFilter(null));
    subFilter.addFilter(new FuzzyRowFilter(null));

    mainFilter.addFilter(new ColumnPrefixFilter(Bytes.toBytes("d")));
    mainFilter.addFilter(subFilter);

You can define a mainFilter with MUST_PASS_ALL operator and a subFilter with MUST_PASS_ONE. Now add the filter conditions into subFilter and then add back this subFilter into mainFilter.



回答2:

FilterList is a Filter itself, so just combine them

FilterList fuzzy = new FilterList(MUST_PASS_ONE, fuzzy1, fuzzy2);
FilterList main = new FilterList(MUST_PASS_ALL, prefixFilter, fuzzy);
s.setFilter(main);


标签: java hbase