如何解决最后记录cassandra中的每组
我有一个带架构的表:
create table last_message_by_group
(
date date,created_at timestamp,message text,group_id bigint,primary key (date,created_at,message_id)
)
with clustering order by (created_at desc)
并且数据应该是:
| date | created_at | message | group_id |
| 2021-05-11 | 7:23:54 | ddd | 1 |
| 2021-05-11 | 6:21:43 | ccc | 1 |
| 2021-05-11 | 5:35:16 | bbb | 2 |
| 2021-05-11 | 4:38:23 | aaa | 2 |
它将按日期按 created_at desc 分区显示消息顺序。
但问题是无法获取每个组喜欢的最后一条消息:
| date | created_at | message | group_id |
| 2021-05-11 | 7:23:54 | ddd | 1 |
| 2021-05-11 | 5:35:16 | bbb | 2 |
created_at 是集群键,所以它不能更新,所以我通过 group_id 删除并插入每条新消息的新行,这样会降低性能
有没有办法做到这一点?
解决方法
我能够通过对主键定义进行一项更改来使其发挥作用。我添加了 group_id
作为第一个聚类键:
PRIMARY KEY (date,group_id,created_at,message_id)
插入相同的数据后,这有效:
> SELECT date,max(created_at),message
FROM last_message_by_group
WHERE date='2021-05-11'
GROUP BY date,group_id;
date | group_id | system.max(created_at) | message
------------+----------+---------------------------------+---------
2021-05-11 | 1 | 2021-05-11 12:23:54.000000+0000 | ddd
2021-05-11 | 2 | 2021-05-11 10:35:16.000000+0000 | bbb
(2 rows)
官方文档中有更多关于使用 CQL 的 GROUP BY 子句的详细信息。
有一个问题,因为你改变了集群键,所以消息将首先按 group_id 排序。任何想法仍然通过 created_at 和每组 1 条消息进行排序?
来自上面链接的文档:
GROUP BY
选项只接受主键顺序中的主键列名作为参数。
不幸的是,如果我们将主键定义调整为将 created_at
置于 group_id
之前,我们还必须按 created_at
进行分组。这将为每个唯一的 created_at
创建一个“组”,从而否定 group_id
背后的想法。
在这种情况下,您可能需要在按特定顺序分组结果与完全分组之间做出决定。也可以对结果进行分组,然后在应用程序端对它们进行适当的重新排序。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。