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