如何使用where子句从cassandra表中获取最大值



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

SELECT MAX(idt) FROM table WHERE idt < 2018

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

谢谢

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

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

然后,您的密钥看起来像((bucket), id)排序 id DESC 在分区头最大。在这种情况下,存储桶是按年份排列的,因此最终每年进行一次您寻找的查询。如果 IDT 不是唯一的,您可能需要执行以下操作:

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

SELECT max(idt) FROM table WHERE GROUP BY bucket

虽然还是更好

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

这将为您提供每个存储桶的最大值,因此您必须浏览它并自己生成全局最大值,但这对集群更好,因为它会自然地限制一点,而不是单个查询猛击整个集群。在该查询上,将提取大小限制为 10 或 100 或默认的 5000 可能是个好主意,因此结果集页速度较慢(防止在协调器上做太多工作(。

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

最新更新