HBase:如何在单个扫描操作中指定多个前缀过滤器

时间:2016-12-10 09:50:55

标签: java scala hadoop mapreduce hbase

我使用前缀过滤器得到了给定部分行密钥的扫描结果:

行键示例:123_abc,456_def,789_ghi

var prefix=Bytes.toBytes("123")
var scan = new Scan(prefix)
var prefixFilter = new PrefixFilter(prefix)
scan.setFilter(prefixFilter)
var resultScanner = table.getScanner(scan)

现在,我的问题是如何指定多个前缀过滤器作为扫描操作的输入。 Result对象应包含具有给定前缀的行键值的所有行,例如123或456。

我尝试过以下使用FilterList方法但无法获得所需结果的答案:

Set Multiple prefix row filter to scanner hbase java

对此(在Scala或Java中)的任何帮助将不胜感激。谢谢。

1 个答案:

答案 0 :(得分:3)

请检查docs of filter list您可能没有使用正确的选项......

  

FilterList.Operator.MUST_PASS_ALL(AND)或   FilterList.Operator.MUST_PASS_ONE(OR)。由于您可以使用筛选器列表   作为过滤器列表的子项,您可以创建过滤器层次结构   被评估。 FilterList.Operator.MUST_PASS_ALL延迟评估:   只要一个过滤器不包含KeyValue,评估就会停止。   FilterList.Operator.MUST_PASS_ONE非懒惰地评估:所有过滤器   总是被评估。默认为FilterList.Operator.MUST_PASS_ALL。

 /* FilterList.Operator.MUST_PASS_ALL by default */
      FilterList allFilters = new FilterList(FilterList.Operator.MUST_PASS_ONE);
      allFilters.addFilter(new PrefixFilter(Bytes.toBytes("123")));
     allFilters.addFilter(new PrefixFilter(Bytes.toBytes("456")));
     allFilters.addFilter(new PrefixFilter(Bytes.toBytes("678")));
    scan.setFilter(allFilters);

    var resultScanner = table.getScanner(scan)

指向验证:

因为你已经使用过FilterList,我想你可能已经使用了默认值MUST_PASS_ALL,所有前缀条件都需要 遇见可能就是为什么它没有给出结果。

前面提到的代码应该工作..祝你好运