2012-08-23 37 views
3

我需要使用HBase掃描來掃描符合特定條件的所有行:這就是爲什麼我會使用過濾器(真的是複合過濾器列表,包括兩個SingleColumnValueFilter)。現在,我已經構建這樣我rowKeys:在HBase中使用掃描開始行,結束行和過濾器

a.b.x|1|1252525 
a.b.x|1|2373273 
a.b.x|1|2999238 
... 
a.b.x|2|3000320 
a.b.x|2|4000023 
... 
a.b.y|1|1202002 
a.b.y|1|1778949 
a.b.y|1|2738273 

,並作爲額外的要求,我需要遍歷僅具有rowKey開始「ABX | 1」的行

現在,問題

  1. 如果我在我的過濾器列表中使用額外的PrefixFilter,掃描儀總是掃描所有行(並且每個行都應用過濾器)?
  2. 如果我實例化掃描傳遞一個startRow(前綴)和filterlist(沒有PrefixFilter),我知道掃描從給定的行前綴開始。所以,假設我使用「a.b.x.」作爲startRow,掃描是否也會掃描a.b.y?
  3. 如果我使用新的Scan(startRow,endRow)然後setFilter,那麼行爲是什麼?總之,缺少構造函數Scan(byte [] start,byte [] end,Filter filter)呢?提前

感謝
安德烈

回答

2

排按鍵排序在HBase的(詞彙)。因此,所有的「abx | 1」會出現在「abx | 2」之前,依此類推。 由於行鍵以字節數組的形式存儲並按字典順序排序,因此要小心非固定長度的行鍵,並且在混合組成不同的角色類別。 但爲了您的要求,這條線上的東西應該工作:

Scan scan = new Scan(Bytes.ToBytes("a.b.x|1"),Bytes.toBytes("a.b.x|2"); //creating a scan object with start and stop row keys 

scan.setFilter(colFilter);//set the Column filters you have to this scan object. 

//And then you can get a scanner object and iterate through your results 
ResultScanner scanner = table.getScanner(scan); 
for (Result result = scanner.next(); result != null; result = scanner.next()) 
{ 
    //Use the result object 
} 
+0

感謝您的迴應,但我認爲,不回答我的問題。我的意思是,我知道關於字典順序和掃描問題,我的代碼正在工作,沒關係。我的問題是關於內部掃描是如何執行的(參見三個問題)。無論如何非常感謝你 – Andrea