Cassandra CQL-具有多个聚类列的聚类顺序

问题描述 投票:6回答:3

我有一个列族,其主键定义如下:

...
PRIMARY KEY ((website_id, item_id), user_id, date)

将使用查询查询,例如:

SELECT * FROM myCF
WHERE website_id = 30 AND item_id = 10
AND user_id = 0 AND date > 'some_date' ;

但是,我只想按日期对列族进行排序,例如SELECT date FROM myCF ;将返回最近插入的日期。

由于集群列的顺序,我得到的是每个user_id然后每个日期的顺序。如果我将主键定义更改为:

PRIMARY KEY ((website_id, item_id), date, user_id)

我不能再运行相同的查询,因为必须限制日期为user_id为。

我以为可以说些什么:

...
  PRIMARY KEY ((website_id, shop_id), store_id, date)
) WITH CLUSTERING ORDER BY (store_id RANDOMPLEASE, date DESC) ;

但是它似乎不存在。最糟糕的是,也许这完全是愚蠢的,我不明白为什么。

有什么方法可以实现这一目标?我想念什么吗?

非常感谢!

cassandra cql cql3 cqlsh
3个回答
8
投票

您的查询示例限制了user_id,因此它应与第二种表格格式一起使用。但是,如果您实际上是在尝试运行查询,例如

SELECT * FROM myCF
WHERE website_id = 30 AND item_id = 10
AND date > 'some_date'

然后您需要创建一个用于处理这些查询的附加表,它将仅按日期排序,而不按用户ID排序

Create Table LookupByDate ... PRIMARY KEY ((website_id, item_id), date)

1
投票

除了主要查询之外,如果您尝试获得的只是“返回最近插入的日期”,则可能不需要其他表格。您可以使用“静态列”存储每个分区的最后更新时间。 CASSANDRA-6561


0
投票

[这可能无法解决您的特殊情况(因为我想您的所有用户列表都非常庞大),但是如果第一个聚类列上的条件与一组相对较小的值匹配,则可以使用[C0 ]。

IN

不要在分区键上使用SELECT * FROM myCF WHERE website_id = 30 AND item_id = 10 AND user_id IN ? AND date > 'some_date' ,因为这会创建效率低下的查询,该查询会打中多个节点,从而给协调节点带来压力。而是并行执行多个异步查询。但是clustering列上的IN绝对可以。

© www.soinside.com 2019 - 2024. All rights reserved.