甘道夫 HBase(0.96以上版本)過濾器Filter詳解及執行個體代碼__HBase
來源:互聯網
上載者:User
說明: 本文參考官方 Ref Guide, Developer API和眾多部落格,並結合實測代碼編寫,詳細總結HBase的Filter功能,並附上每類Filter的相應代碼實現。 本文盡量遵從 Ref Guide中“9.4. Client Request Filters”的行文順序,便於讀者對比查看,但內容比官方文檔更加詳實。
***2014年7月18日更新,新增PageFilter和SkipFilter。***
歡迎轉載,請註明來源: http://blog.csdn.net/u010967382/article/details/37653177
目錄:
引言 -- 參數基礎
1. 結構(Structural)過濾器--FilterList
2.列值過濾器--SingleColumnValueFilter
2.1.第一種建構函式情況 -- 比較的關鍵字是字元數組
2.2.第二種建構函式情況 -- 比較的關鍵字是比較子ByteArrayComparable
3.索引值中繼資料
3.1. 基於列族過濾資料的FamilyFilter
3.2. 基於限定符Qualifier(列)過濾資料的QualifierFilter
3.3. 基於列名(即Qualifier)首碼過濾資料的ColumnPrefixFilter
3.4. 基於多個列名(即Qualifier)首碼過濾資料的MultipleColumnPrefixFilter
3.5. 基於列範圍(不是行範圍)過濾資料ColumnRangeFilter
4. RowKey
5. PageFilter
6. SkipFilter
7. Utility--FirstKeyOnlyFilter
8. 取得查詢結果
引言 -- 參數基礎
有兩個參數類在各類Filter中經常出現,統一介紹下:
(1)比較子 CompareFilter.CompareOp
比較子用於定義比較關係,可以有以下幾類值供選擇: EQUAL 相等
GREATER 大於
GREATER_OR_EQUAL 大於等於
LESS 小於
LESS_OR_EQUAL 小於等於
NOT_EQUAL 不等於
(2)比較子 ByteArrayComparable 通過比較子可以實現多樣化目標匹配效果,比較子 有以下子類可以使用: BinaryComparator 匹配完整位元組數組
BinaryPrefixComparator 匹配位元組數組首碼
BitComparator
NullComparator
RegexStringComparator Regex匹配
SubstringComparator 子串匹配
1. 結構(Structural)過濾器--FilterList FilterList 代表一個
過濾器鏈 ,它可以包含一組即將應用於目標資料集的過濾器 ,過濾器間具有“與” FilterList.Operator.MUST_PASS_ALL 和“或” FilterList.Operator.MUST_PASS_ONE 關係。
官網執行個體代碼, 兩個 “
或” 關係的 過濾器 的寫法: FilterList list = new FilterList(FilterList.Operator.MUST_PASS_ONE); //資料只要滿足一組過濾器中的一個就可以 SingleColumnValueFilter filter1 = new SingleColumnValueFilter( cf, column, CompareOp.EQUAL, Bytes.toBytes("my value") ); list.add(filter1); SingleColumnValueFilter filter2 = new SingleColumnValueFilter( cf, column, CompareOp.EQUAL, Bytes.toBytes("my other value") ); list.add(filter2); Scan scan = new Scan(); scan.setFilter(list); 2. 列值過濾器--SingleColumnValueFilter
SingleColumnValueFilter 用於測試 列值
相等 (CompareOp.EQUAL ), 不等 (CompareOp.NOT_EQUAL),或單側範圍 (e.g., CompareOp.GREATER)。
建構函式:
(1)比較的關鍵字是一個字元數組 SingleColumnValueFilter(byte[] family, byte[] qualifier, CompareFilter.CompareOp compareOp, byte[] value)
(2)比較的關鍵字是一個比較子(比較子下一小節做介紹) SingleColumnValueFilter(byte[] family, byte[] qualifier, CompareFilter.CompareOp compareOp, ByteArrayComparable comparator)
2.1.第一種建構函式情況 -- 比較的關鍵字是字元數組
官網範例程式碼, 檢查列值和字串'my value' 相等: SingleColumnValueFilter filter = new SingleColumnValueFilter( cf, column, CompareOp.EQUAL, Bytes.toBytes("my value") ); scan.setFilter(filter);
個人實測代碼: HTable table = HBaseDAO.getHTable("147patents"); FilterList filterList =
new FilterList(FilterList.Operator.MUST_PASS_ALL);
SingleColumnValueFilter filter =
new SingleColumnValueFilter( Bytes.toBytes("patentinfo"), Bytes.toBytes("CREATE_TIME"), CompareOp.EQUAL, Bytes.toBytes("2013-06-08") ); filterList.addFilter(filter); Scan scan =
new Scan(); scan.setFilter(filterList); ResultScanner rs = table.getScanner(scan);
for (Result r : rs) { System.out.println("Scan: " + r); } table.close();
注意:還是大寫問題,HBase的列名必須大寫。
2.2.第二種建構函式情況 -- 比較的關鍵字是比較子
ByteArrayComparable 該章節主要是針對 SingleColumnValueFilter的 第二種建構函式使用方式做了一些舉例:
(1)支援值比較的Regex -- RegexStringComparator
官網範例程式碼: RegexStringComparator comp = new
RegexStringComparator("my."); //任意以my打頭的值 SingleColumnValueFilter filter = new SingleColumnValueFilter( cf, column, CompareOp.EQUAL, comp ); scan.setFilter(filter);
個人實測代碼: HTable table = HBaseDAO.getHTable("147patents"); FilterList filterList =
new FilterList(FilterList.Operator.MUST_PASS_ALL); RegexStringComparator comp =
new RegexStringComparator("2013-06-1."); SingleColumnValueFilter filter =
new SingleColumnValueFilter( Bytes.toBytes("patentinfo"), Bytes.toBytes("CREATE_TIME"), CompareOp.EQUAL, comp ); filterList.addFilter(filter); Scan scan =
new Scan(); scan.setFilter(filterList); ResultScanner rs = table.getScanner(scan);
for (Result r : rs) { System.out.println("Scan: " + r); } table.close();
(2)檢測一個子串是否存在於值中(
大小寫不敏感 ) -- SubstringComparator
官網範例程式碼: SubstringComparator comp = new
SubstringComparator("y val"); // looking for 'my value' SingleColumnValueFilter filter = new SingleColumnValueFilter( cf, column, CompareOp.EQUAL, comp ); s