Hbase過濾器簡介 HBase的基本API,包括增、刪、改、查等,增、刪都是相對簡單的操作,與傳統的RDBMS相比,這裡的查詢操作略顯蒼白,只能根據特性的行鍵進行查詢(Get)或者根據行鍵的範圍來查詢(Scan)。 HBase不僅提供了這些簡單的查詢,而且提供了更加高級的過濾器(Filter)來查 ...
Hbase過濾器簡介
HBase的基本API,包括增、刪、改、查等,增、刪都是相對簡單的操作,與傳統的RDBMS相比,這裡的查詢操作略顯蒼白,只能根據特性的行鍵進行查詢(Get)或者根據行鍵的範圍來查詢(Scan)。 HBase不僅提供了這些簡單的查詢,而且提供了更加高級的過濾器(Filter)來查詢。通過這些過濾器可以在HBase中的數據的多個維度(行,列,數據版本)上進行對數據的篩選操作,也就是說過濾器最終能夠篩選的數據能夠細化到具體的一個存儲單元格上(由行鍵,列明,時間戳定位)。
HBase過濾器的類型很多,但是可以分為兩大類:比較過濾器,專用過濾器。
1. 比較過濾器 - 通用比較器
比較器作為過濾器的核心組成之一,用於處理具體的比較邏輯,例如位元組級的比較,字元串級的比較等。
- BinaryComparator
二進位比較器,用於按字典順序比較 Byte 數據值
- BinaryPrefixComparator
首碼二進位比較器,按首碼比較
- NullComparator
判斷給定的是否為空
- BitComparator
按位比較
- RegexStringComparator
支持正則表達式的值比較,僅支持 EQUAL 和非EQUAL
- SubstringComparator
判斷提供的子串是否出現在value中,不區分大小寫
2. 比較過濾器 - 通用操作符
HBase提供了枚舉類型的變數來表示我們常用的抽象操作符。
- LESS <
- LESS_OR_EQUAL <=
- EQUAL =
- NOT_EQUAL <>
- GREATER_OR_EQUAL >=
- GREATER >
- NO_OP 排除所有
3.比較過濾器 - 行健過濾器
- RowFilter 篩選出行健匹配的所有的行
- 語法 RowFilter(操作符,比較器)
- 性能 一般來講,執行 Scan 使用 startRow/stopRow 方式比較好
- 示例代碼
new RowFilter(CompareFilter.CompareOp.EQUAL, new BinaryComparator( Bytes.toBytes("testRowkey1"))) 篩選出行健等於testRowkey1的行 new RowFilter( CompareFilter.CompareOp.LESS_OR_EQUAL, new BinaryComparator( Bytes.toBytes("testRowkey20"))) 篩選出行健小於等於testRowkey20的行
- 調用示例
Connection connection = ConnectionFactory.createConnection( ConfigFactory.getInstance().getHbaseConf()); Table table = connection.getTable(TableName.valueOf(tableName)); Scan scan = new Scan(); Filter filter = new RowFilter(CompareFilter.CompareOp.EQUAL, new BinaryComparator(Bytes.toBytes(rowkey))); scan.setFilter(filter); ResultScanner results = table.getScanner(scan);
4.比較過濾器 - 列簇過濾器
- FamilyFilter 篩選出列簇匹配的數據 返回數據的單位是Cell,而不是整行數據
- 語法 FamilyFilter(操作符,比較器)
- 性能 通常在 Scan 過程中通過設定某些列族來實現該功能,而不是直接使用該過濾器
- 示例代碼
new FamilyFilter(CompareFilter.CompareOp.EQUAL, new BinaryComparator( Bytes.toBytes("family1"))) 篩選出列簇等於family1的cell new FamilyFilter(CompareFilter.CompareOp.LESS, new BinaryComparator(Bytes.toBytes("family20"))) 篩選出列簇小於family20的cell
5.比較過濾器 - 子列過濾器
- QualifierFilter 篩選出子列匹配的數據 返回數據的單位是Cell,而不是整行數據
- 語法 QualifierFilter(操作符,比較器)
- 示例代碼
new QualifierFilter(CompareOp.EQUAL, new RegexStringComparator("you.")); 篩選出子列以you開頭,不止是you,以及空的cell new QualifierFilter(CompareOp.NOT_EQUAL, new BinaryComparator(Bytes.toBytes("column1"))) 篩選出子列不等於column1的cell
6.比較過濾器 - 子列範圍過濾器
- ColumnRangeFilter 該過濾器用於獲取一個指定子列範圍內的所有Cell。
- 語法 ColumnRangeFilter(子列起始值、是否包含起始值,子列結束值,是否包含結束值)
- 性能 該過濾器可以進行高效的子列內部掃描(因為子列是已經按字典排序好的),HBase-0.9.2 版本引入該功能。
- 示例代碼
new ColumnRangeFilter( Bytes.toBytes("column1"), true, Bytes.toBytes("column10"), true) 篩選出子列大於等於column1,小於等於column10的 所有cell
7.比較過濾器 -列值過濾器
- ValueFilter 篩選出列值匹配的數據 返回數據的單位是Cell,而不是整行數據
- 語法 ValueFilter(操作符,比較器)
- 示例代碼
new ValueFilter(CompareFilter.CompareOp.EQUAL, new SubstringComparator("value")) 篩選出所有列值中包含value的cell
8.專用過濾器 - 行健首碼過濾器
- PrefixFilter 篩選出行健首碼匹配的所有的行
- 語法 PrefixFilter(行健首碼)
- 示例代碼
new PrefixFilter(Bytes.toBytes("testRowkey")) 篩選出行健首碼等於testRowkey的所有行
9.專用過濾器 - 子列首碼過濾器
- ColumnPrefixFilter 篩選出包含首碼的所有子列 返回數據的單位是Cell,而不是整行數據一般來講
- 語法 ColumnPrefixFilter(首碼)
- 示例代碼
new ColumnPrefixFilter(Bytes.toBytes("column")) 篩選出所有以column開頭子列的cellnew ColumnPrefixFilter(Bytes.toBytes("column")) 篩選出所有以column開頭子列的cell
10.專用過濾器 - 多子列首碼過濾器
- MultipleColumnPrefixFilter MultipleColumnPrefixFilter 與 ColumnPrefixFilter 的行為類似,但可以指定多個子列首碼
- 語法 MultipleColumnPrefixFilter(首碼byte二維數組)
- 示例代碼
byte[][] prefixes = new byte[][]{Bytes.toBytes("column 1"), Bytes.toBytes("column2")} new MultipleColumnPrefixFilter (prefixes) 篩選出所有以column1和column2開頭子列的cell
11.專用過濾器 - 列綜合過濾器
- DependentColumnFilter 該過濾器嘗試找到該列簇、子列所在的Cell。
- 語法 DependentColumnFilter(列簇、子列)
- 示例代碼
new DependentColumnFilter( Bytes.toBytes("family1"), Bytes.toBytes("column1")) 篩選出所有列簇family1、子列column1的所有Cell
12.專用過濾器 - 結構過濾器
- FilterList 該過濾器代表一個過濾器鏈 ,它可以包含一組即將應用於目標數據集的過濾器,過濾器間具有“與”和“或”關係。
- 語法
FilterList(列關係、過濾器集合)
FilterList.Operator.MUST_PASS_ ALL 關係與
FilterList.Operator.MUST_PASS_ ONE 關係或
- 示例代碼
Connection connection = ConnectionFactory.createConnection( ConfigFactory.getInstance().getHbaseConf()); Table table = connection.getTable(TableName.valueOf(tableName)); Scan scan = new Scan(); Filter filter1 = new RowFilter(CompareFilter.CompareOp.EQUAL, new BinaryComparator(Bytes.toBytes(rowkey))); Filter filter2 = new DependentColumnFilter( Bytes.toBytes(“family1”), Bytes.toBytes(“column1”)); List<Filter> filters = new ArrayList<>(2); filters.add(filter1); filters.add(filter2); FilterList filterList = new FilterList(FilterList.Operator.MUST_PASS_ALL, filters); scan.setFilter(filterList); ResultScanner results = table.getScanner(scan);