我应该如何设计模式以获取Cassandra中每个集群密钥的最后2条记录?

时间:2017-12-03 01:59:52

标签: cassandra cql

我的表格中的每一行都有4个值product_iduser_idupdated_atrating

我想创建一个表格,了解在给定时间段内有多少用户更改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);

但是我无法找到在给定时间窗口内只获取每个用户的最后两行的方法。

任何有关查询或更改架构的建议都将受到赞赏。

1 个答案:

答案 0 :(得分:0)

Cassandra需要一种基于查询的表格设计方法。这意味着通常一个表将提供一个查询。因此,要提供您正在讨论的查询(每个用户最后两个更新的行),您应该构建一个专门为其提供服务的表:

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;

请注意,您需要自己保持两个评级表同步,并且使用批处理语句是实现此目的的好方法。