# Thrift API 和過濾器語言
> 貢獻者:[xixici](https://github.com/xixici)
Apache [Thrift](https://thrift.apache.org/) 是跨平臺跨語言的開發框架。HBase 包含了 Thrift API 和過濾語言。Thrift API 依賴于客戶端和服務器進程。
你可以在服務端和客戶端維 Thrift 設置安全身份驗證,參照 [Client-side Configuration for Secure Operation - Thrift Gateway](#security.client.thrift) 和 [Configure the Thrift Gateway to Authenticate on Behalf of the Client](#security.gateway.thrift).
接下來,討論 Thrift API 所提供的過濾器語言。
## 103\. 過濾器語言
Thrift 過濾語言在 HBase 0.92 版本引入. 提供了通過在 HBase 上使用 Thrift 或使用 HBase Shell 來進行服務端過濾. 你可以在 Shell 中,使用`scan help`查看詳細信息.
將過濾器寫成字符串,在服務端解析成過濾器。
### 103.1\. 常規過濾字符串語法
字符串形式過濾器:
```
“FilterName (argument, argument,... , argument)”
```
記住以下語法規則:
* 指定過濾器的名稱,后跟括號中以逗號分隔的參數列表。
* 如果參數是字符串,應該用單引號`'`包括。
* 布爾值, 整形, 比較符 ( <, >, !=)不需要用引號包括。
* 過濾器名稱必須是單個單詞。除空格,單引號和括號外,允許使用所有 ASCII 字符。
* 過濾器的參數可以包含任何 ASCII 字符。如果參數中存在單引號,則必須通過附加的前一個單引號對其進行轉義。
### 103.2\. 復合過濾器和運算符
二元運算符
`AND`
使用 `AND` ,鍵值對必須滿足兩端過濾器
`OR`
使用 `OR`,鍵值對至少滿足一端過濾器
一元運算符
`SKIP`
對特定行,如果鍵值對不滿足過濾,則跳過此行
`WHILE`
對特定行, 鍵值將通過,直至過濾條件不滿足為止。
Example 29\. 復合運算符
你可以組合運算符來創建層次結構的過濾器如:
```
(Filter1 AND Filter2) OR (Filter3 AND Filter4)
```
### 103.3\. 運算次序
1. 括號有著最高優先級
2. 然后是一元運算符 `SKIP` 和 `WHILE` ,優先級相同
3. 二元運算符 `AND` 最高, 其次 `OR`
Example 30\. 優先級示例
```
Filter1 AND Filter2 OR Filter
is evaluated as
(Filter1 AND Filter2) OR Filter3
```
```
Filter1 AND SKIP Filter2 OR Filter3
is evaluated as
(Filter1 AND (SKIP Filter2)) OR Filter3
```
你可以使用括號精確控制運算順序
### 103.4\. 比較運算符
以下比較運算符:
1. LESS (<)
2. LESS_OR_EQUAL (?)
3. EQUAL (=)
4. NOT_EQUAL (!=)
5. GREATER_OR_EQUAL (>=)
6. GREATER (>)
7. NO_OP (no operation)
客戶端應采用(<, ?, =, !=, >, >=) 表示比較
### 103.5\. 比較器
比較器可以如下任一種:
1. _BinaryComparator_ - 按字典順序比較特定字節數組,使用 Bytes.compareTo(byte[], byte[])
2. _BinaryPrefixComparator_ - 按字典順序比較特定字節數組,只比較字節數組長度.
3. _RegexStringComparator_ - 使用給定正則表達式,比較特定字節組。在這種比較器中,只有 EQUAL 和 NOT_EQUAL 有效
4. _SubStringComparator_ - 給定字符子串是否出現在特定字節組中。不區分大小寫。在這種比較器中,只有 EQUAL 和 NOT_EQUAL 有效
比較器一般語法規則: `ComparatorType:ComparatorValue`
不同比較器的不同比較類型:
1. _BinaryComparator_ - binary 二進制
2. _BinaryPrefixComparator_ - binaryprefix 二進制長度
3. _RegexStringComparator_ - regexstring 正則表達式
4. _SubStringComparator_ - substring 子字符串
ComparatorValue 可以任意值
比較示例:
1. `binary:abc` 匹配字典順序大于"abc"
2. `binaryprefix:abc` 匹配字典書序前 3 字符等于 "abc"
3. `regexstring:ab*yz` 匹配以 ab 開頭,已 yz 結尾的內容
4. `substring:abc123` 匹配所有以"abc123"開頭的內容
### 103.6\. PHP 客戶端使用示例
```
<?
$_SERVER['PHP_ROOT'] = realpath(dirname(__FILE__).'/..');
require_once $_SERVER['PHP_ROOT'].'/flib/__flib.php';
flib_init(FLIB_CONTEXT_SCRIPT);
require_module('storage/hbase');
$hbase = new HBase('<server_name_running_thrift_server>', <port on which thrift server is running>);
$hbase->open();
$client = $hbase->getClient();
$result = $client->scannerOpenWithFilterString('table_name', "(PrefixFilter ('row2') AND (QualifierFilter (>=, 'binary:xyz'))) AND (TimestampsFilter ( 123, 456))");
$to_print = $client->scannerGetList($result,1);
while ($to_print) {
print_r($to_print);
$to_print = $client->scannerGetList($result,1);
}
$client->scannerClose($result);
?>
```
### 103.7\. 過濾器示例
* `"PrefixFilter ('Row') AND PageFilter (1) AND FirstKeyOnlyFilter ()"` 會返回符合下列條件的所有鍵值對
1. 鍵值對所在行有前綴 _Row_
2. 鍵值對必須處于第一行
3. 鍵值對必須是第一個鍵值
* `"(RowFilter (=, 'binary:Row 1') AND TimeStampsFilter (74689, 89734)) OR ColumnRangeFilter ('abc', true, 'xyz', false))"` 會返回符合下列條件的所有鍵值對
* 鍵值對所在行有前綴 _Row 1_
* 鍵值必須具有時間戳 74689 或者 89734.
* 或者滿足一下條件:
* 鍵值對必須位于字典序 >= abc 和 < xyz 之間
* `"SKIP ValueFilter (0)"` 如果行中任何值部位 0, 則跳過
### 103.8\. 單個過濾器語法
KeyOnlyFilter
此過濾器不帶任何參數。它僅返回每個鍵值的關鍵組件。
FirstKeyOnlyFilter
此過濾器不帶任何參數。它僅返回每行的第一個鍵值。
PrefixFilter
此過濾器采用一個參數 - 行鍵的前綴。它僅返回以指定行前綴開頭的行中存在的鍵值
ColumnPrefixFilter
此過濾器采用一個參數 - 列前綴。它僅返回以指定列前綴開頭的列中存在的鍵值。列前綴的格式必須為: `“qualifier”`.
MultipleColumnPrefixFilter
此過濾器采用列前綴列表。它返回以任何指定列前綴開頭的列中存在的鍵值。每個列前綴必須采用以下形式:`“qualifier”`.
ColumnCountGetFilter
此過濾器采用一個參數 - 一個限制。它返回表中的第一個限制列數。
PageFilter
此過濾器采用一個參數 - 頁面大小。它返回表中的頁面大小行數。
ColumnPaginationFilter
此過濾器有兩個參數 - 限制和偏移。它返回偏移列數后的列數限制。它為所有行執行此操作。
InclusiveStopFilter
此過濾器使用一個參數 - 要停止掃描的行鍵。它返回行中存在的所有鍵值,包括指定的行。
TimeStampsFilter
此過濾器采用時間戳列表。它返回時間戳與任何指定時間戳匹配的鍵值。
RowFilter
該過濾器采用比較運算符和比較器。它使用 compare 運算符將每個行鍵與比較器進行比較,如果比較返回 true,則返回該行中的所有鍵值。
Family Filter
該過濾器采用比較運算符和比較器。它使用比較運算符將每個列族名稱與比較器進行比較,如果比較返回 true,則返回該列族中的所有單元格。
QualifierFilter
該過濾器采用比較運算符和比較器。它使用 compare 運算符將每個限定符名稱與比較器進行比較,如果比較返回 true,則返回該列中的所有鍵值。
ValueFilter
該過濾器采用比較運算符和比較器。它使用比較運算符將每個值與比較器進行比較,如果比較返回 true,則返回該鍵值。
DependentColumnFilter
此過濾器有兩個參數 - 族和限定符。它嘗試在每一行中找到此列,并返回該行中具有相同時間戳的所有鍵值。如果該行不包含指定的列 - 將返回該行中的任何鍵值。
SingleColumnValueFilter
該過濾器采用列族,限定符,比較運算符和比較器。如果未找到指定的列 - 將發出該行的所有列。如果找到該列并且與比較器的比較返回 true,則將發出該行的所有列。如果條件失敗,則不會發出該行。
SingleColumnValueExcludeFilter
此過濾器采用相同的參數,其行為與 SingleColumnValueFilter 相同 - 但是,如果找到該列并且條件通過,則除了測試的列值之外,將發出該行的所有列。
ColumnRangeFilter
此過濾器僅用于選擇列在 minColumn 和 maxColumn 之間的鍵。它還需要兩個布爾變量來指示是否包含 minColumn 和 maxColumn。
- HBase? 中文參考指南 3.0
- Preface
- Getting Started
- Apache HBase Configuration
- Upgrading
- The Apache HBase Shell
- Data Model
- HBase and Schema Design
- RegionServer Sizing Rules of Thumb
- HBase and MapReduce
- Securing Apache HBase
- Architecture
- In-memory Compaction
- Backup and Restore
- Synchronous Replication
- Apache HBase APIs
- Apache HBase External APIs
- Thrift API and Filter Language
- HBase and Spark
- Apache HBase Coprocessors
- Apache HBase Performance Tuning
- Troubleshooting and Debugging Apache HBase
- Apache HBase Case Studies
- Apache HBase Operational Management
- Building and Developing Apache HBase
- Unit Testing HBase Applications
- Protobuf in HBase
- Procedure Framework (Pv2): HBASE-12439
- AMv2 Description for Devs
- ZooKeeper
- Community
- Appendix