天天看點

Hbase FilterList使用總結

我們知道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比對就會停止,不會再進行了.

繼續閱讀