• Hbase FilterList使用总结


    作者:Syn良子 出处:http://www.cnblogs.com/cssdongl/p/7098138.html 转载请注明出处

    我们知道Hbase的Scan经常需要用到filter来过滤表中的数据返回给客户端,单个的filter还好说,如果有多个呢,那么就需要使用FilterList,它也是继承于抽象类Filter,
    里面持久化了一个有序的order list来存储不同的filter对数据进行过滤.

    FilterList分为二种类型,如下
    FilterList allFilters = new FilterList(FilterList.Operator.MUST_PASS_ONE);
    或者
    FilterList allFilters = new FilterList(FilterList.Operator.MUST_PASS_ALL);

    查看源代码,可以仔细看下如下注释

    • {@link Operator#MUST_PASS_ALL} evaluates lazily: evaluation stops as soon as one filter does
    • not include the KeyValue.
    • {@link Operator#MUST_PASS_ONE} evaluates non-lazily: all filters are always evaluated.

    二种区别根据上述注释理解,其实就相当于and和or的关系.MUST_PASS_ONE只要scan的数据行符合其中一个filter就可以返回结果(但是必须扫描所有的filter),
    另外一种MUST_PASS_ALL必须所有的filter匹配通过才能返回数据行(但是只要有一个filter匹配没通过就算失败,后续的filter停止匹配)。这里可能说起来有点绕。
    那么来一段代码体会

    FilterList allFilters = new FilterList(FilterList.Operator.MUST_PASS_ALL);
    allFilters.addFilter(new PrefixFilter(Bytes.toBytes("abc")));
    allFilters.addFilter(new RowFilter(CompareFilter.CompareOp.EQUAL,
                new RegexStringComparator(".*_(xyz|xxx)$"));
    allFilters.addFilter(new QualifierFilter(CompareFilter.CompareOp.EQUAL,
                new SubstringComparator("china")));
    scan.setFilter(allFilters);
    

    第一个PrefixFilter是对rowkey的前缀进行过滤,第2个RowFilter是对rowKey进行正则匹配,rowkey的结尾必须满足特定的字符串,第三个QualifierFilter是对列限定符
    进行匹配,列限定符必须equal字符串"china"才可以.那么FilterList在这里的类型由于是MUST_PASS_ALL,因此扫描的数据行必须匹配通过这3个filter才可以返回结果.而
    实际在扫描匹配的时候,由于filter是有序的,那么在匹配第一个filter的时候,如果已经不符合了,后面的几个filter匹配就会停止,不会再进行了.

  • 相关阅读:
    Redis 优缺点
    如何保证接口的幂等性。。。。。
    自动化部署 jenkins 插件简介
    JWT与Session比较和作用
    代码注释鉴赏,喜欢就拿去用!
    python中计时模块timeit的使用方法
    【Java】JavaIO(二)、节点流
    【Java】JavaIO(一)、基础知识
    【Git】四、Git工作
    【Git】三、工作区、暂存区、版本库
  • 原文地址:https://www.cnblogs.com/cssdongl/p/7098138.html
Copyright © 2020-2023  润新知