首页 > 解决方案 > 如何使用 where 子句从 cassandra 表中获取最大值

问题描述

我有一点设计问题,我有以下要求:

SELECT MAX(idt) FROM table WHERE idt < 2018

但我不知道如何根据这个请求创建表。 idt必须是一个集群键才能执行大于小于操作以及最大聚合,但我不知道应该使用什么作为分区键(我不想使用 ALLOW FILTERING)。我发现的唯一解决方案是使用常量值作为分区键,但我知道它被认为是一个糟糕的设计。有什么帮助吗?

谢谢,

标签: databasecassandracql

解决方案


您将需要以某种方式对数据进行分区。如果你不这样做,就像你说的那样,要么从整个集群中读取所有内容(允许过滤),要么将所有内容放在一个分区中(常量键)。对您的数据、设计或目标一无所知,常见的设置是按日期进行分区,例如:

SELECT id FROM table WHERE bucket = '2018' AND id < 100 limit 1;

然后你的键看起来像((bucket), id)在分区的头部排序 id DESC 所以最大。在这种情况下,存储桶是按年计算的,因此最终每年都会查询您要查找的内容。如果 idt 不是唯一的,您可能需要执行以下操作:

((uuid), idt)((bucket), uuid, idt)按 idt DESC 排序(如果该记录不是唯一的,则再次发出问题)。然后你可以做类似的事情

SELECT max(idt) FROM table WHERE GROUP BY bucket

虽然还是更好

SELECT max(idt) FROM table WHERE bucket = '2018' GROUP BY bucket

这将为您提供每个存储桶的最大值,因此您必须对其进行分页并自己生成全局最大值,但对于集群来说更好,因为它自然会限制一点点而不是单个查询猛烈抨击整个集群。在该查询上将获取大小限制为 10 或 100 或与默认的 5000 相比可能是个好主意,因此结果集页面速度较慢(防止协调器上的工作过多)。

要在其他地方完成所有这些工作,您可能需要考虑使用 Spark,因为它可以为您提供更多丰富的查询并尽可能高效地完成(这可能效率不高,但它会尝试)。


推荐阅读