最后记录每个组在卡桑德拉
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
.
背后的想法
在这种情况下,您可能必须决定是按特定顺序对结果进行分组还是将它们完全分组。也可以对结果进行分组,然后在应用程序端对它们进行适当的重新排序。
我有一个 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
.
在这种情况下,您可能必须决定是按特定顺序对结果进行分组还是将它们完全分组。也可以对结果进行分组,然后在应用程序端对它们进行适当的重新排序。