我有一個行鍵模式像20110103 ---這樣的行鍵將像20110103-1-23-333。HBase行鍵和範圍掃描
當我做使用例如掃描範圍查詢, STARTROW - > 20110103-1-23- endRow - > 20110105-1-23-
我得到不屬於上述範圍內的行以及。例如,我也得到20110105-1-15-6666行。我也得到了與商店15相關的行。
我該如何解決這個問題?請問對這個問題.... RegularExpressionFilter解決這個....
請諮詢
我有一個行鍵模式像20110103 ---這樣的行鍵將像20110103-1-23-333。HBase行鍵和範圍掃描
當我做使用例如掃描範圍查詢, STARTROW - > 20110103-1-23- endRow - > 20110105-1-23-
我得到不屬於上述範圍內的行以及。例如,我也得到20110105-1-15-6666行。我也得到了與商店15相關的行。
我該如何解決這個問題?請問對這個問題.... RegularExpressionFilter解決這個....
請諮詢
你列出的三個行鍵:
20110103-1-23-
20110105-1-15-666
20110105-1-23-
看起來像自然排序順序給我;以「20110103」開頭的那個確實出現在「666」結尾。 (有一點混淆可能是HBase,這些都只是字節,而字典式排序一次只能完成一個字節;所以,「aaa」會排在「aa」之後但排在「ab」之前。 )
行20110105-1-15-6666正確在範圍[20110103-1-23-,20110105-1-23-)中,因爲15小於23,並且行的排序是詞典。
您提到「我也獲得了與商店15相關的行」,這讓我想象行密鑰中的第三個數字(________-_-23-
)是該行的某種屬性。
我建議改變這個表的模式,使這個「門店數量」一欄,讓你的鑰匙能像20110103-1
和列「存儲」你有這些數字15
或23
或什麼的。
這樣,在掃描中,可以過濾掉列存儲= 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
是日期)作爲時間戳(表格的單元格)而不是行鍵。這取決於你的應用程序。
,你可以打開HBase的外殼發出以下命令
scan 'YourHbaseTableName',{FILTER=>"(RowFilter(=,'regexstring:20110103'))"}
假設的HBase作爲一個字節多個嵌套有序圖。 因此,您需要將時間戳保存在二進制演示文稿中,以便在每個查詢中獲得正確的順序。
我想您保存rowkey值的字符串數據類型,例如使用Java方法:
yourDateString.getBytes(encoding)
或
Bytes.toBytes(yourDateString)
通過HBase的API添加。
我的建議是將時間值保存爲時間戳(長)。 這一長串應該被序列化爲字節,然後保存在rowkey中。 請注意,由於不斷上升的特性,在rowkey中保存時間戳有點問題。時間戳每毫秒會變大,因此每個新值都將保存到管理此區域的HBase區域。簡而言之,您只需寫入其中一個羣集機器,這不是使用HBase羣集的目標。 對於大小爲100 machnies的羣集,您可以使用salting(在rowkey前面放置一個隨機數,以將所有值分配到整個羣集中)。 查看phoenix項目。 它爲你做所有的translating,salting等,提供簡單的SQL語句。