Java HBase:如何在一次扫描操作中指定多个前缀筛选器
我已使用前缀过滤器获得给定部分行键的扫描结果: 行关键示例:123_abc、456_def、789_ghiJava 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) 现在,我的问题是如何指定多个前缀过滤器
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)