我使用前缀过滤器得到了给定部分行密钥的扫描结果:
行键示例: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中)的任何帮助将不胜感激。谢谢。
答案 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
,所有前缀条件都需要
遇见可能就是为什么它没有给出结果。
前面提到的代码应该工作..祝你好运