最后记录每个组在卡桑德拉

Last record each group in cassandra

我有一个 table 架构:

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, group_id, 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 子句的详细信息。

there is one problem, because you changed clustering key, so message will be ordered by group_id first. Any idea for still order by created_at and 1 message each group?

来自上面链接的文档:

the GROUP BY option only accept as arguments primary key column names in the primary key order.

不幸的是,如果我们要调整主键定义以将created_at 放在 group_id之前,我们还必须按[=14分组=].这将为每个独特的 created_at 创建一个“组”,从而否定 group_id.

背后的想法

在这种情况下,您可能必须决定是按特定顺序对结果进行分组还是将它们完全分组。也可以对结果进行分组,然后在应用程序端对它们进行适当的重新排序。