如何在 java 中创建 HBbase 复合过滤器
How to create HBbase Compound filters in java
我了解到从 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) OR (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 ... )
希望我说清楚了。
谢谢!
A 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))
的逻辑等价物
我了解到从 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) OR (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 ... )
希望我说清楚了。
谢谢!
A 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))