2017-12-03 148 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

相关问题