2014-09-19 64 views
0

我對Cassandra的數據建模新的排序,我真的需要同樣的建議,這裏是我的問題:卡桑德拉架構設計的時候

我需要創建一個新列的家庭,讓我來存儲和檢索最後插入分數:

CREATE TABLE average_score(
    audit_time timestamp PRIMARY KEY, 
    pages_count int, 
    score float, 
) 

插入的數據是根據主鍵不排序(我使用的是隨機partinioner(默認)),你有什麼解決辦法嗎?我可以爲這個家族列指定一個不同的分區器嗎?

感謝

回答

2

下面是可能澄清一些事情給你一個小時的分區系列表的例子:

CREATE TABLE average_score(
    hour timestamp, 
    audit_time timeuuid, 
    pages_count int, 
    score float, 
    PRIMARY KEY (hour, audit_time) 
) 
WITH CLUSTERING ORDER BY (audit_time DESC) 

警告:雖然我們對數據分區相當精細地,你仍然有一點寫熱點的,如果你只是追加新的成績,因爲他們註冊。

乾杯!

P.S.如果您仍然陷入困境,那麼DataStax CQL文檔是數據建模幫助的重要資源。

+0

+1使用'hour'作爲分區鍵,audit_time作爲集羣鍵。好解決方案! – Aaron 2014-09-22 22:36:32

+0

非常感謝您的幫助!我非常棒。 – 2014-10-25 08:33:21

+0

否則你的解決方案還有一個最後的問題,我如何檢索最後插入的數據,我不知道最後使用小時是什麼....(在我的上下文中,我們不插入數據每小時) – 2014-10-25 08:35:24

0

你可以存儲所有的(理論上,實際上,你可能會選擇一些最大列數)在一個單一的行值,使用時間戳列名。 通過這樣做,您的數據可以通過遍歷列按時間順序遍歷。

一定要記住:cassandra中的主鍵不是用於排序,而是用於羣集節點之間的分區。

另請參閱http://rubyscale.com/blog/2011/03/06/basic-time-series-with-cassandra/瞭解更多信息。

0

那麼你可以使用Ordered partitioner,但不建議這樣做。

替代解決方案

如果分數是一個實體(用戶),然後使用實體和日期(您時間戳日部分)組合的行鍵即分區鍵。

列名作爲時間戳(Cassandra中的TimeUUID),其值作爲分數。創建列族時需要使用「reversed = True」,因爲您需要最近的條目。

然後,你可以做一個切片查詢以獲得您想要的結果