使用掃描過濾器
基本上,Scan 物件從表中檢索所有行,但是如果只想檢索給定列的值等於某些行的行,該怎麼辦?讓我向你介紹過濾器,它們的工作方式類似於 SQL 中的 WHERE 。
在開始使用過濾器之前,如果你知道如何儲存 row_keys ,則可以為掃描設定起始行和結束行,這將優化你的查詢。
在 HBase 中, row_keys 儲存在字典順序中,但你仍然可以使用 salting 來改變它的儲存方式,我不會在這個主題中解釋 salting,這將花費太長時間而且不是重點。
讓我們回到行邊界,你有兩種方法可以用來設定起始行和結束行
Scan scan = new Scan();
scan.setStartRow(Bytes.toBytes("row_10"));
scan.setStopRow(Bytes.toBytes("row_42"));
這將改變你的掃描器行為以獲取“row_10”和“row_42”之間的所有行。
注意 :與大多數子方法(例如 substring)一樣,startRow 是包含的,stopRow 是獨佔的。
既然我們可以繫結掃描,我們現在應該為掃描新增一些過濾器,其中有很多,但我們會在這裡看到最重要的過濾器。
- 如果要檢索具有以給定模式開頭的 row_key 的所有行
使用 RowPrefixFilter
:
Scan scan = new Scan();
scan.setRowPrefixFilter(Bytes.toBytes("hello"));
使用此程式碼,你的掃描將僅檢索具有以 hello
開頭的 row_key 的行。
- 如果要檢索給定列的值等於某些內容的所有行
使用 SingleColumnValueFilter
:
Scan scan = new Scan();
SingleColumnValueFilter filter = new SingleColumnValueFilter(Bytes.toBytes("myFamily"),Bytes.toBytes("myColumn"), CompareOp.EQUAL, Bytes.toBytes("42"));
scan.setFilter(filter);
使用此程式碼,你將獲得 myColumn 列的值等於 42 的所有行。你可以在引數部分中解釋 CompareOp
的不同值。
- 好,但如果我想使用正規表示式怎麼辦?
使用 RegexStringComparator
過濾器:
Scan scan = new Scan();
RegexStringComparator comparator = new RegexStringComparator(".hello.");
SingleColumnValueFilter filter = new SingleColumnValueFilter(Bytes.toBytes("myFamily"),Bytes.toBytes("myColumn"), CompareOp.EQUAL, comparator);
scan.setFilter(filter);
並且你將獲得 myColumn 列包含 hello 的所有行。
另請注意,方法 Scan.setFilter()
也可以將 Filter
列表作為引數