做者: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
二種區別根據上述註釋理解,其實就至關於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