Как написать запрос Cassandra с разрывными значениями для столбца в предложении where - PullRequest
1 голос
/ 28 января 2020

У меня есть данные временного ряда power_drawl с интервалом в 1 минуту в течение нескольких лет. То есть каждый день будет иметь 1440 (60 минут * 24 часов) значений.

Это моя таблица,

CREATE TABLE power_drawl (date date, time time, x_power_mw float, PRIMARY KEY(date, time)) WITH CLUSTERING ORDER BY (time ASC); 




SELECT * FROM power_drawl WHERE date='2016-01-01' and time>='00:00:00' and time<='00:10:00' ALLOW FILTERING ;   

 date       | time               | x_power_mw
------------+--------------------+--------------------------------
 2016-01-01 | 00:00:00.000000000 |                          23.95
 2016-01-01 | 00:01:00.000000000 |                          24.17
 2016-01-01 | 00:02:00.000000000 |                          23.52
 2016-01-01 | 00:03:00.000000000 |                          21.17
 2016-01-01 | 00:04:00.000000000 |                          24.53
 2016-01-01 | 00:05:00.000000000 |                          25.06
 2016-01-01 | 00:06:00.000000000 |                           28.5
 2016-01-01 | 00:07:00.000000000 |                          25.52
 2016-01-01 | 00:08:00.000000000 |                          25.66
 2016-01-01 | 00:09:00.000000000 |                           25.4
 2016-01-01 | 00:10:00.000000000 |                          23.25

Теперь у меня есть такой запрос
"Что такое max значение x_power_mw с 12:00 до 14:00 каждый день в январе месяце с 2011 по 2015 г. и когда это произошло "
". И в приведенном выше запросе, что, если я хочу запросить запрос на 2011 и 2015 гг. а не с 2011 по 2015 годы (разрывные значения) "

Мне кажется, что невозможно написать один запрос cql для этих запросов.
1) Как написать запрос cql с where предложение с 2011 и 2015 годами, а не с 2011 по 2015 год?

2) Является ли хорошей идеей запрашивать отдельно для каждого года и вычислять максимум на стороне клиента?

3) Является ли мой data model правильным для этих запросов, если нет, то который является правильным (следует ли отделять год от даты, добавляемой в качестве составного ключа кластеризации)?

1 Ответ

0 голосов
/ 02 февраля 2020
  1. Поскольку в вашем случае вы используете date в качестве ключа раздела, вам необходимо сгенерировать все возможные значения для всех дней в январе 2011-2015 гг. И выполнять запросы параллельно ( не рекомендуется использовать IN на ключе раздела , так как это приведет к перегрузке координирующего узла). В вашем случае вы получите 155 запросов для выполнения.

  2. Вы можете использовать max в своем запросе, чтобы выполнить поиск нужного значения, хотя будет сложнее получить связанную временную метку (возможно, вы можете использовать пользовательскую функцию для возврата кортеж макс / метка времени). Но выполнять фильтрацию на стороне клиента можно, так как вы передаете только 120 значений (1 в минуту).

  3. Теоретически вы можете использовать год в качестве ключа раздела и использовать timestamp вместо time для столбца кластеризации, но в этом случае вы получите ~ 0,5 миллиона ячеек на раздел, что превышает рекомендуемое максимальное значение 100k / раздел. Вы все еще можете использовать дату, но урезать ее до месяца, чтобы получить ~ 45 тыс. Ячеек на раздел и продолжать использовать timestamp в качестве столбца кластеризации. Но это может не помочь с выбором только определенных c диапазонов внутри каждого дня.

...