2017-12-03 120 views
1

我的表中的每一行都有4個值product_iduser_idupdated_atrating我應該如何設計模式以獲取Cassandra中每個集羣密鑰的最後2條記錄?

我想創建一個表來找出有多少用戶在一定時期內改變rating

目前我的模式是這樣的:

CREATE TABLE IF NOT EXISTS ratings_by_product (
    product_id int, 
    updated_at timestamp, 
    user_id int, 
    rating int, 
    PRIMARY KEY ((product_id ), updated_at , user_id)) 
WITH CLUSTERING ORDER BY (updated_at DESC, user_id ASC); 

,但我不能想出的辦法只能獲得在給定的時間窗口中的最後2行,每行用戶。

上查詢或更改架構任何意見,將不勝感激。

回答

0

卡桑德拉需要一個基於查詢的方式來表設計。這意味着通常一個表格將提供一個查詢。所以,爲您服務是在談論(每用戶最後兩個更新行)查詢,你應該建立專門服務於它的表:

CREATE TABLE ratings_by_user_by_time (
    product_id int, 
    updated_at timestamp, 
    user_id int, 
    rating int, 
    PRIMARY KEY ((user_id ), updated_at, product_id)) 
WITH CLUSTERING ORDER BY (updated_at DESC, product_id ASC); 

然後,你將能夠獲得最後兩個更新的等級爲用戶通過執行以下操作:

SELECT * FROM ratings_by_user_by_time 
WHERE user_id = 'Bob' LIMIT 2; 

請注意,你需要保持兩個等級表中同步自己,並使用批處理語句來實現這一目標的好方法。

+0

感謝阿龍,問題是我不能夠知道哪些用戶評價某一個產品,除非我跑了一個額外的查詢。另一個問題是在您的表格中,我只能得到給定用戶的所有產品評級,而不是所有用戶對特定產品的最後2個評級,難道我不能嗎? – Harrison

+0

@哈里森對不起,我以爲我讀到你想給用戶的最後2個評級。但是,您希望時間範圍內* ALL *用戶的最後2個評分...不是嗎?是的,單靠CQL是不可能的。這聽起來像你需要做一個子查詢,使用類似Spark的東西。 – Aaron

相關問題