我知道从 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
运算符来定义如何处理过滤器。
在我的例子中,我想定义一个扫描,它将使用 RowFilter
仅在某些特定行上执行一些 QualifierFilter
。
例如:如果 rowkey 包含“$today”,则过滤掉具有限定符“number_eggs_produced”的列族,因为它太早了。否则不要过滤它。
(!RowFilter) 或 (RowFilter AND QualifierFilter)
目前我发现了 2 个不好的解决方法:
- 我开始编写客户过滤器,但它可能已经受到支持,因为 shell 必须调用 java 代码,但我没有看到它。
我手动过滤结果中的数据:
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 ... )
我希望我是清楚的。
谢谢!
最佳答案
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))
关于java - 如何在 java 中创建 HBbase 复合过滤器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37306871/