Hbase Filter之FilterList

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

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

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

查看源代码,能够仔细看下以下注释spa

  • {@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中止匹配)。这里可能提及来有点绕。
那么来一段代码体会code

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

相关文章
相关标签/搜索