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

Rag*_*ghu 4 java hadoop hbase scala mapreduce

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

行键示例: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)
Run Code Online (Sandbox Code Playgroud)

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

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

将多个前缀行过滤器设置为扫描器 hbase java

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

Ram*_*ram 6

请检查此过滤器列表文档,您可能没有使用正确的选项...

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)
Run Code Online (Sandbox Code Playgroud)

要验证的点:

由于您已经使用过FilterList,我认为您可能已经使用了默认值,即MUST_PASS_ALL需要满足所有前缀条件的原因可能就是它没有给出结果的原因。

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