2013-04-25 180 views
4

我想知道HBase是否支持RowKey掃描中的通配符。類似的東西來:對RowKey中通配符的HBase支持

select * from TABLE where KEY like '%SEARCH_KEY%'; 

我明白,我們可以使用部分鍵掃描,如果我們有到rowkey前綴的一些知識(和HBase的是非常有效的與該掃描)。但是,如果我們沒有前綴信息(這意味着搜索鍵可能在RowKey中的任何位置),那麼Hbase必須運行全表掃描,是否正確?

另外,我怎樣才能在HBase(無論是代碼還是通過shell)形成這樣的查詢?

回答

4

您只能執行基於前綴的行鍵掃描。

說你有這樣的數據:

aaa_001 
aaa_002 
aab_001 
aac_001 
baa_001 
... 
zzz_001 

使用HappyBase,你可以寫這樣的代碼來獲得AAA *

for key in table.scan(row_prefix="aaa"): 
    print key 

將打印

aaa_001 
aaa_002 

,而這樣的代碼:

for key in table.scan(row_prefix="aa"): 
    print key 

會得到你:

aaa_001 
aaa_002 
aab_001 
aac_001 

所以,你可以做基於前綴的匹配,而不是後綴爲基礎的。希望這是有用的。

+0

謝謝你的回覆網速慢,但我的問題是關於如果我們沒有前綴的信息和我們的搜索鍵可在rowkey的任何部分。我認爲在這種情況下HBase不是高性能的,並且需要全表掃描。我只是想確認一下。謝謝! – Prashant 2013-07-10 04:06:26

+0

是的,你可以使用列過濾器,但我相信這需要全表掃描。 – Suman 2013-07-10 14:23:33

0

您可以將RegexStringComparator和RowFilter一起使用並指定正則表達式,但是它會在完整表掃描中結束。

RegexStringComparator comp = new RegexStringComparator("my."); // any value that starts with 'my' 
SingleColumnValueFilter filter = new SingleColumnValueFilter(
cf, 
column, 
CompareOp.EQUAL, 
comp 
); 
scan.setFilter(filter); 

而是SingleColumnValueFilter的使用了一個RowFilter