【问题标题】:HBase: How to specify multiple prefix filters in a single scan operationHBase:如何在单个扫描操作中指定多个前缀过滤器
【发布时间】:2017-04-25 17:54:54
【问题描述】:

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

行键示例: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 中)的任何帮助将不胜感激。谢谢。

【问题讨论】:

    标签: java scala hadoop mapreduce hbase


    【解决方案1】:

    请检查此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,所有前缀条件都需要 遇到可能这就是为什么它没有给出结果。

    上述代码应该可以工作。祝你好运

    【讨论】:

    • 我对运算符 MUST_PASS_ALL 有疑问。即使所有给定的前缀值都存在于 hbase 中,它也不会产生正确的输出。但是当我使用 MUST_PASS_ONE 时,它就可以工作了。你能找出这背后的原因吗?
    • 原因很简单,就像 c 或任何其他语言这样的编程基础...... true 和 true 是 true (MUST_PASS_ALL case )。具有相同前缀的行如何同时满足所有条件。所以我使用了 true 或 true(MUST_PASS_ONE);明白了吗?
    • 关于此解决方案性能的说明:您正在执行全表扫描并通过这些过滤器放置所有行。一般来说,这是非常低效的。如果表很大,并且只有少数前缀使用scan.setRowPrefixFilter(prefix) 进行多次扫描,可能会更快。
    • 是的,我更喜欢对于大表使用模糊行过滤器,它会跳转到使用占位符处理的行。所以它更快。我将它用于大型 hbase 表。效果很好
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-29
    • 2013-09-12
    • 2012-06-12
    • 2018-08-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多