Кассандровый эквивалент группы по - PullRequest
0 голосов
/ 24 ноября 2018

Я на начальных этапах моделирования данных в Кассандре для приложения.Это приложение имеет существующий реляционный персистентный слой, который должен быть заменен на Cassandra.

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

Вот CQL, который я использую для создания этой таблицы

create table login_log (
    user_id int,
    application_name text,
    login_date timestamp,
    primary key (user_id, application_name, login_date)
) with clustering order by (application_name asc, login_date desc)

user_id - ключ раздела.application_name и login_date - ключи кластеризации.В этой таблице ведется история входов в систему, в ней никогда не удаляются данные.

Я пытаюсь получить дату последнего входа в систему с указанным user_id для всех приложений в одном запросе.

Если яписали запрос SQL, чтобы сделать то же самое, это выглядело бы примерно так:

select user_id, application_name, max(login_date) from login_log group by user_id, application_name

Однако это не может быть сделано в Cassandra, так как нет функции группировки по выражениям или агрегации.Возможно, столбцы кластеризации уже сгруппированы, но я не могу создать запрос, который извлекает последние login_date для всех приложений в одном запросе.

Если бы вы делали это для одного приложения, CQL выглядело бы как ниже

select * from login_log where user_id = ? and application_name = ? limit 1

Поскольку кластер уже упорядочен по login_date, order by не требуется.Мне нужно расширить один и тот же запрос, чтобы получить данные для всех приложений за один раз.

Возможно ли это сделать в Кассандре?Если нет, то есть ли метод моделирования данных, который позволил бы мне сделать это?

Любой намек приветствуется.

1 Ответ

0 голосов
/ 24 ноября 2018

GROUP BY поддерживается с версией 3.10 проверки улучшения билета здесь и Cassandra официальная документация .

...