Hbase FilterList使用总结

xiaoxiao2021-02-28  82

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

转载请注明原文地址: https://www.6miu.com/read-49721.html

最新回复(0)