hbase:如何在一次扫描操作中指定多个前缀过滤器

64jmpszr  于 2021-05-29  发布在  Hadoop
关注(0)|答案(1)|浏览(447)

我使用前缀过滤器得到给定部分行键的扫描结果:
行键示例:123\u 、456\u def、789\u 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方法的答案,但没有得到所需的结果:
将多前缀行筛选器设置为scanner hbase java
在此方面的任何帮助(scala或java)都将不胜感激。谢谢您。

v1uwarro

v1uwarro1#

请检查此文档的筛选列表您可能没有使用正确的选项。。。
filterlist.operator.must\ u pass\ u all(and)或filterlist.operator.must\ u pass\ u one(or)。由于可以将筛选器列表用作筛选器列表的子级,因此可以创建要计算的筛选器的层次结构。filterlist.operator.must \u pass \u all evaluates lazy:一旦一个筛选器不包含keyvalue,计算就会停止。filterlist.operator.must \u pass \u one evaluates non lazy:始终计算所有筛选器。默认为filterlist.operator.must\u pass\u 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 所有的前缀条件都需要满足,这就是为什么它不能给出结果的原因。
上述代码应该有效。。祝你好运

相关问题