database - 如何使用 where 子句从 cassandra 表中获取最大值
问题描述
我有一点设计问题,我有以下要求:
SELECT MAX(idt) FROM table WHERE idt < 2018
但我不知道如何根据这个请求创建表。 idt必须是一个集群键才能执行大于或小于操作以及最大聚合,但我不知道应该使用什么作为分区键(我不想使用 ALLOW FILTERING)。我发现的唯一解决方案是使用常量值作为分区键,但我知道它被认为是一个糟糕的设计。有什么帮助吗?
谢谢,
解决方案
您将需要以某种方式对数据进行分区。如果你不这样做,就像你说的那样,要么从整个集群中读取所有内容(允许过滤),要么将所有内容放在一个分区中(常量键)。对您的数据、设计或目标一无所知,常见的设置是按日期进行分区,例如:
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,因为它可以为您提供更多丰富的查询并尽可能高效地完成(这可能效率不高,但它会尝试)。
推荐阅读
- php - 在 mcrypt 上使用谜
- python - 将每个索引的编号放在numpy的对应位置
- elasticsearch - 查询多个索引时,仅检索弹性搜索命中中的特定 _index 文档
- java - 使用杰克逊转换带有重复键的 JSON
- wordpress - 如何在使用 WP 加载页面期间阻止外部静态资源
- java - 如何测试 AOP 拦截器?
- c++ - cmake生成的执行文件使用gdb失败
- java - 是否可以让 Maven "WAR" pom.xml 将我的类打包到一个 JAR 中并将 JAR 放在 /WEB-INF/lib 文件夹中?
- c - 如何处理 C 中的未定义行为错误?
- vue.js - 如何在 v-for 循环中跟踪父元素?