我不能談論卡桑德拉,所以我就回答您的問題與HBase的考慮方面查詢卡桑德拉和HBase的主要區別因爲這類問題在這裏被多次提出。您基本上需要一個二級索引,它並不直接支持HBase,請閱讀以下有關它的文檔:http://hbase.apache.org/book/secondary.indexes.html
現在,根據您的訪問模式,我會建議您手動雙寫入數據表和用作具有2種不同類型的行鍵的二級索引的表格;
[ip_as_long]-1-[timestamp]-[appname]
[ip_as_long]-2-[appname]-[timestamp]
該表只有一個系列,其中一列由數據表中數據點的rowkey組成。有了良好的緩衝區,您將不會遇到任何性能問題。
要查詢基於ip的數據,只需掃描索引表,設置起始行爲「[ip_as_long] -1-」以通過時間戳查詢,或者查詢爲「[ip_as_long] -2- [appname]」來查詢由應用程序名稱。該掃描將爲您提供可用於執行multiget到數據表以檢索它的rowkeys。
考慮到這種方法,您可以使用另一個輔助索引表,其中應用程序名稱爲主要維度,因此您還可以通過「[appname] - [timestamp]」查詢數據。
建議:如果您有足夠的存儲空間,而不是將rowkey寫入索引,那麼我只需寫入整個數據本身,這樣就可以避免執行multiget。
如果我維護兩個表,其中不同形式的相同行鍵映射到一個uid和另一個表,其中uid_timestamp存儲鍵值對,那麼我的表現如何? –
如果您執行返回幾行的查詢(因爲從索引讀取數據後需要額外的multiget),那將會非常好。在索引表中存儲數據表的行鍵對於大型掃描來說不會很好。如果您需要對索引表執行大型掃描,請堅持我提到的建議,它會更快:將所有數據存儲在索引表中而不是rowkey中,您將有數據重複(將相同的列存儲在兩個表),但是你不應該害怕這個,當你使用HBase時,這是一種常見的方法。 –