2012-04-23 71 views
2

我有一個行鍵模式像20110103 ---這樣的行鍵將像20110103-1-23-333。HBase行鍵和範圍掃描

當我做使用例如掃描範圍查詢, STARTROW - > 20110103-1-23- endRow - > 20110105-1-23-

我得到不屬於上述範圍內的行以及。例如,我也得到20110105-1-15-6666行。我也得到了與商店15相關的行。

我該如何解決這個問題?請問對這個問題.... RegularExpressionFilter解決這個....

請諮詢

回答

7

你列出的三個行鍵:

20110103-1-23- 
20110105-1-15-666 
20110105-1-23- 

看起來像自然排序順序給我;以「20110103」開頭的那個確實出現在「666」結尾。 (有一點混淆可能是HBase,這些都只是字節,而字典式排序一次只能完成一個字節;所以,「aaa」會排在「aa」之後但排在「ab」之前。 )

0

行20110105-1-15-6666正確在範圍[20110103-1-23-,20110105-1-23-)中,因爲15小於23,並且行的排序是詞典。

您提到「我也獲得了與商店15相關的行」,這讓我想象行密鑰中的第三個數字(________-_-23-)是該行的某種屬性。

我建議改變這個表的模式,使這個「門店數量」一欄,讓你的鑰匙能像20110103-1和列「存儲」你有這些數字1523或什麼的。

這樣,在掃描中,可以過濾掉列存儲= 15的行。

如果您使用的是Java API,這看起來像:

SingleColumnValueFilter filter = new SingleColumnValueFilter(
    Bytes.toBytes("columnfamily"), 
    Bytes.toBytes("storenumber"), 
    CompareFilter.CompareOp.NOT_EQUAL, 
    Bytes.toBytes(15) 
); 
filter.setFilterIfMissing(true); 
Scan scan = new Scan(
    Bytes.toBytes("20110103-1"), 
    Bytes.toBytes("20110105-1") 
); 
scan.setFilter(filter); 

你可能會在該行密鑰存儲太多的數據,儘量採取一些這些屬性的行鍵,使他們是一個專欄。另外請記住,您也可以使用日期(我假設20110105是日期)作爲時間戳(表格的單元格)而不是行鍵。這取決於你的應用程序。

1

,你可以打開HBase的外殼發出以下命令

scan 'YourHbaseTableName',{FILTER=>"(RowFilter(=,'regexstring:20110103'))"} 
0

假設的HBase作爲一個字節多個嵌套有序圖。 因此,您需要將時間戳保存在二進制演示文稿中,以便在每個查詢中獲得正確的順序。

我想您保存rowkey值的字符串數據類型,例如使用Java方法:

yourDateString.getBytes(encoding) 

Bytes.toBytes(yourDateString) 

通過HBase的API添加。

我的建議是將時間值保存爲時間戳(長)。 這一長串應該被序列化爲字節,然後保存在rowkey中。 請注意,由於不斷上升的特性,在rowkey中保存時間戳有點問題。時間戳每毫秒會變大,因此每個新值都將保存到管理此區域的HBase區域。簡而言之,您只需寫入其中一個羣集機器,這不是使用HBase羣集的目標。 對於大小爲100 machnies的羣集,您可以使用salting(在rowkey前面放置一個隨機數,以將所有值分配到整個羣集中)。 查看phoenix項目。 它爲你做所有的translating,salting等,提供簡單的SQL語句。