Каково будет определенное поведение этого запроса кассандры с неагрегированными столбцами? - PullRequest
7 голосов
/ 01 октября 2019

Предположим, у меня была эта таблица.

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_event для каждого уникального event_type с учетом user_name, user_email и подмножеством * 1008. * s. В качестве примера составной запрос будет выглядеть следующим образом.

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; 

Будет ли этот запрос кассандры вести себя так, как я ожидал? Если нет, то как я могу переформулировать запрос? Я хочу, чтобы столбцы a, b и c совпадали с максимальной строкой, возвращаемой с агрегатом, max(event_time).

Теперь, согласно https://docs.datastax.com/en/dse/5.1/cql/cql/cql_reference/cqlAggregates.html,, Кассандра по умолчанию будет иметь значениепервая строка неагрегированного столбца. Поскольку я полностью указал ключ раздела, я ожидаю, что будет произведен поиск по одному разделу, и поэтому порядок ключей кластеризации в этом разделе будет согласованным.

При локальном тестировании в нескольких строках у меня нетПока не удалось разорвать запрос, но я хочу убедиться, что я не пропускаю неожиданное поведение.

Например, предположим, у нас были следующие данные.

|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 Ответ

4 голосов
/ 04 октября 2019

Добавьте в скрипт выше:

    SELECT DISTINCT(event_type) as event_type;

    ORDER BY event_type, event_time DESC;
...