Java HBase:如何在一次扫描操作中指定多个前缀筛选器

Java HBase:如何在一次扫描操作中指定多个前缀筛选器,java,scala,hadoop,mapreduce,hbase,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) 现在,我的问题是如何指定多个前缀过滤器

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

行关键示例: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)
现在,我的问题是如何指定多个前缀过滤器作为扫描操作的输入。结果对象应该包含具有给定前缀的行键值的所有行,例如123或456

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

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

请检查此选项,您可能没有使用正确的选项

FilterList.Operator.必须通过所有(和)或 FilterList.Operator.必须通过一个(或)。因为你可以使用过滤器列表 作为筛选器列表的子级,可以创建筛选器的层次结构以 进行评估。FilterList.Operator.MUST_PASS_ALL评估延迟: 只要一个过滤器不包含KeyValue,计算就会停止。 FilterList.Operator.MUST_PASS_ONE非惰性计算:所有筛选器 总是要进行评估。默认为FilterList.Operator.MUST\u PASS\u ALL

要验证的点: 由于您已经使用了
FilterList
,我想您可能已经使用了默认值,即
MUST\u PASS\u ALL
,所有前缀条件都需要 met可能是,这就是为什么它没有给出结果


上述代码应该有效。。祝你好运

我怀疑操作员必须通过所有考试。即使所有给定的前缀值都存在于hbase中,它也无法生成正确的输出。但当我使用“必须通过”时,它就起作用了。你能找出这背后的原因吗?原因很简单,在c或任何其他语言的编程基础上。。。true和true均为true(
必须通过所有
案例)。具有相同前缀的行如何同时满足所有条件。所以我用了true或true(
必须通过一个
);明白了吗?关于此解决方案性能的说明:您正在进行完整的表扫描,并将所有行放入这些过滤器。一般来说,这是非常低效的。对于一个大表,只有少数前缀使用
scan进行多次扫描。setRowPrefixFilter(prefix)
可能更快。是的,对于大表,我更喜欢fuzzyrowfilter,它会跳转到使用占位符加工行。所以它更快。我把它用于大型hbase表。它工作得很好
 /* 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)