如何在java中创建HBbase复合过滤器

时间:2016-05-18 17:49:52

标签: java filter hbase

我理解,从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_ALLFilterList.Operator.MUST_PASS_ONE运算符来定义过滤器的处理方式。

在我的情况下,我想定义一个只使用QualifierFilter在某些特定行上执行某些RowFilter的扫描。

例如:如果rowkey包含" $ today",请过滤掉具有限定符" number_eggs_produced的列族,因为它太早了。否则不要过滤它。

(!RowFilter) OR (RowFilter AND QualifierFilter)

目前我发现了2个不好的解决方法:

  • 我开始编写一个Customer过滤器,但可能已经支持了,因为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 ... )
    

我希望我能清楚。

谢谢!

1 个答案:

答案 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))

的逻辑等价物
相关问题