zoukankan      html  css  js  c++  java
  • 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匹配就会停止,不会再进行了.

  • 相关阅读:
    在线教育项目-day02【讲师分页功能和多条件组合查询功能】
    在线教育项目-day02【统一结果返回】
    Go语言数组和切片的原理
    Go语言单元测试与基准测试
    PHPWord导出word文档
    Go语言反射reflect
    漫画:什么是HTTPS?
    什么是shell和终端?
    Go接口interface
    Go变量逃逸分析
  • 原文地址:https://www.cnblogs.com/cssdongl/p/7098138.html
Copyright © 2011-2022 走看看