我理解,从HBase shell可以创建像(Filter1 AND Filter2) OR (Filter3 AND Filter4)
这样的复合过滤器。
参考:http://www.cloudera.com/documentation/enterprise/5-6-x/topics/admin_hbase_filtering.html
但在java中,我只找到FilterList.Operator.MUST_PASS_ALL
和FilterList.Operator.MUST_PASS_ONE
运算符来定义过滤器的处理方式。
在我的情况下,我想定义一个只使用QualifierFilter
在某些特定行上执行某些RowFilter
的扫描。
例如:如果rowkey包含" $ today",请过滤掉具有限定符" number_eggs_produced的列族,因为它太早了。否则不要过滤它。
(!RowFilter) OR (RowFilter AND QualifierFilter)
目前我发现了2个不好的解决方法:
我手动过滤结果中的数据:
ResultScanner scanner = table.getScanner(scan);
for (Result result = scanner.next(); result != null; result = scanner.next())
{
for (Cell cell : result.listCells())
{
String row = Bytes.toString(CellUtil.cloneRow(cell));
long qualifier = Long.valueOf(Bytes.toString(CellUtil.cloneQualifier(cell)));
double value = Double.valueOf(Bytes.toString(CellUtil.cloneValue(cell)));
if(row ... )
我希望我能清楚。
谢谢!
答案 0 :(得分:3)
FilterList
是可组合的。这两个不同的运算符可让您创建AND
列表和OR
列表。例如:
FilterList andFilter = new FilterList(Operator.MUST_PASS_ALL);
FilterList orFilter = new FilterList(Operator.MUST_PASS_ONE);
Scan scan = new Scan();
scan.setFilter(orFilter);
orFilter.addFilter(rowFilter1);
orFilter.addFilter(andFilter); // composition
andFilter.addFilter(rowFilter2);
andFilter.addFilter(rowFilter3);
这是(rowFilter1 || (rowFilter2 && rowFilter3))