Cassandra Data моделирование: метка времени в качестве ключей раздела - PullRequest
4 голосов
/ 07 марта 2019

Мне нужно иметь возможность вернуть всех пользователей, которые выполнили действие в течение указанного интервала.Определение таблицы в Cassandra чуть ниже:

create table t ( timestamp from, timestamp to, user text, PRIMARY KEY((from,to), user))

Я пытаюсь реализовать следующий запрос в Cassandra:

select * from t WHERE from > :startInterval and to < :toInterval

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

Есть ли эффективный способ моделирования этого запроса в Cassandra?

MyРешение состоит в том, чтобы разделить обе метки времени на соответствующие им годы и месяцы и использовать их в качестве ключа разделения.Таблица будет выглядеть следующим образом:

 create table t_updated ( yearFrom int, monthFrom int,yearTo int,monthTo int, timestamp from, timestamp to, user text, PRIMARY KEY((yearFrom,monthFrom,yearTo,monthTo), user) )

Если бы я хотел, чтобы пользователи, которые выполняли действие в период с января 2017 года по июль 2017 года, запрос выглядел бы следующим образом:

select user from t_updated where yearFrom IN (2017) and monthFrom IN (1,2,3,4,5,6,7) and yearTo IN (2017) and  monthTo IN (1,2,3,4,5,6,7)

Будет либыть лучшим способом смоделировать этот запрос в Кассандре?Как бы вы подошли к этому вопросу?

Ответы [ 2 ]

1 голос
/ 07 марта 2019

Во-первых, ключ разделения должен работать с оператором равенства.Лучше использовать PRIMARY KEY (BUCKET, TIME_STAMP) здесь, где bucket может быть комбинацией года, месяца (или включать дни, часы и т. Д. В зависимости от того, насколько большой ваш набор данных).

Лучше выполнитьнесколько запросов и объединить результат на стороне клиента.

1 голос
/ 07 марта 2019

Ответ зависит от ожидаемого количества записей.Правило большого пальца состоит в том, что раздел не должен превышать 100 МБ.Поэтому, если вы ожидаете умеренное количество записей, достаточно указать год в качестве ключа раздела.

Мы используем Week-First-Date в качестве ключа раздела в сценарии iot, где значения записываются максимумраз в минуту.

...