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匹配就会停止,不会再进行了.

  • 相关阅读:
    面试题
    iOS 对overflow:scroll使用
    iOS微信页面 长按图片出现【存储图像】和【拷贝】不出现【发送朋友】【保存图片】
    cookie设置和读取以及获取超链接参数
    学习资源链接
    gulp中文乱码问题
    原生ajax基础知识笔记
    Visual Studio Code 插件推荐
    前端开发中一些容易混淆的概念汇总
    jq中的类样式操作与html5中的类样式操作的对比
  • 原文地址:https://www.cnblogs.com/cssdongl/p/7098138.html
Copyright © 2011-2022 走看看