使用掃描過濾器

基本上,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 列表作為引數