最后记录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 背后的想法。

在这种情况下,您可能需要在按特定顺序分组结果与完全分组之间做出决定。也可以对结果进行分组,然后在应用程序端对它们进行适当的重新排序。