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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM