这个带有非聚合列的 cassandra 查询的定义行为是啥?

Posted

技术标签:

【中文标题】这个带有非聚合列的 cassandra 查询的定义行为是啥?【英文标题】:What would be the defined behavior of this cassandra query with nonaggregate columns?这个带有非聚合列的 cassandra 查询的定义行为是什么? 【发布时间】:2020-01-31 03:35:00 【问题描述】:

假设我有这张桌子。

CREATE TABLE keyspace.user_event (
   user_name varchar,
   user_email varchar,
   event_type int,
   event_time timestamp,
   a varchar,
   b varchar,
   c varchar
   PRIMARY KEY ((user_name, user_email), event_type, event_time)
) WITH CLUSTERING ORDER BY (event_type ASC, event_time DESC);

我有兴趣为给定user_nameuser_emailevent_types 的子集的每个唯一event_type 查找最新的user_event。例如,组合查询如下所示。

SELECT user_name, 
       user_email, 
       event_type, 
       max(event_time) AS event_time, 
       a, 
       b, 
       c 
FROM   user_event 
WHERE  user_name = 'user_name3' 
       AND user_email = 'user_email3' 
       AND event_type IN ( 301, 219, 206, 226 ) 
GROUP  BY event_type; 

这个 cassandra 查询的行为是否符合我的预期?如果没有,我该如何重新制定查询?我希望列 abc 与聚合返回的最大行 max(event_time) 匹配。

现在,根据https://docs.datastax.com/en/dse/5.1/cql/cql/cql_reference/cqlAggregates.html,cassandra 将默认为非聚合列的第一行。因为我完全指定了分区键,所以我希望搜索单个分区,因此集群键的顺序在该分区内是一致的。

通过对几行的本地测试,我还不能中断查询,但我想确保我没有遗漏任何意外行为。

举个例子,假设我们有以下数据。

|user_email |user_name  |event_type|a  |b  |c  |event_time               |
|-----------|-----------|----------|---|---|---|-------------------------|
|user_email2| user_name2|219       |a1 |b1 |c1 | 2019-10-01 18:50:25.653Z|
|user_email3| user_name3|219       |a2 |b2 |c2 | 2019-10-01 18:50:25.665Z|
|user_email3| user_name3|226       |a3 |b3 |c3 | 2019-10-01 21:37:05.663Z|
|user_email3| user_name3|301       |a4 |b4 |c4 | 2019-10-01 18:50:35.658Z|
|user_email3| user_name3|301       |a5 |b5 |c5 | 2019-10-01 18:50:25.660Z|
|user_email3| user_name3|301       |a6 |b6 |c6 | 2019-10-01 18:50:25.656Z|
|user_email1| user_name1|206       |a7 |b7 |c7 | 2019-10-01 18:50:25.604Z|

上述查询的预期输出是。

event_type |    a,b,c   |
-----------|------------|
226        | a3, b3, c3 |  
219        | a2, b2, c2 |
301        | a4, b4, c4 |

【问题讨论】:

【参考方案1】:

将以下内容添加到上面的脚本中:

    SELECT DISTINCT(event_type) as event_type;

    ORDER BY event_type, event_time DESC;

【讨论】:

以上是关于这个带有非聚合列的 cassandra 查询的定义行为是啥?的主要内容,如果未能解决你的问题,请参考以下文章

Cassandra:带有地图结果的 UDF 在 Java 中获取 CodecNotFoundException

带有子查询的 SQL 多个聚合函数

Cassandra 聚合到 Map

SQL语句汇总(三)——聚合函数分组子查询及组合查询 - Darly

如何编写带有联接和聚合的 SQLAlchemy 查询?

GROUP BY 子句并在查询中包含非聚合列