2015-04-02 3 views
0

Прежде чем вы сделаете снимок, я хотел бы заявить, что я посмотрел на все подобные вопросы, но я все еще получаю, что ошибка «PRIMARY KEY column не может быть ограничена».Запрос на временный интервал Кассандры

Вот моя структура таблицы:

CREATE TABLE IF NOT EXISTS events (
    id text, 
    name text, 
    start_time timestamp, 
    end_time timestamp, 
    parameters blob, 
    PRIMARY KEY (id, name, start_time, end_time) 
); 

А вот запрос я пытаюсь выполнить:

SELECT * FROM events WHERE name = ? AND start_time >= ? AND end_time <= ?; 

Я действительно застрял на этом. Может ли кто-нибудь сказать мне, что я делаю неправильно?

Спасибо, Deniz

ответ

1

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

В принципе, всякий раз, когда вы видите, что «COLUMN не может быть ограничено» Это означает, что запрос, который вы пытались выполнить, не может быть эффективно выполнен на созданной вами таблице.

+1

Спасибо за ответ. Хотя я использую встроенный Cassandra в один режим, я решил использовать Spark. Я задавался вопросом, можно ли его решить, и ваш ответ дал понять это поведение. –

1

Для выполнения запроса, используйте предложение ALLOW фильтрования,

SELECT * FROM analytics.events WHERE name = ? AND start_time >= ? AND end_time <= ? ALLOW FILTERING; 
+0

К сожалению, я до сих пор получаю сообщение об ошибке «ПЕРВИЧНАЯ КОЛОНКА end_time не может быть ограничено». Есть идеи? –

+1

Использование 'ALLOW FILTERING' не является чем-то, что следует поощрять. – Aaron

0

«Общий» rule Чтобы сделать запрос, вам нужно передать хотя бы все столбцы ключей разделов, тогда вы можете добавить каждый ключ в том порядке, в котором они установлены ». Поэтому, чтобы вы могли выполнить эту работу, d необходимо добавить where id = x.

Однако похоже, что это сообщение об ошибке означает, что после того, как вы выберете «start_time> 34», который так далеко «вниз по цепочке», вам разрешено идти иначе, это потребует «потенциально слишком дорогостоящий» флаг ALLOW FILTERING.Так что это должно быть «только равенство» до одной комбинации < > в одном столбце. Все в названии скорости. Это работает (хотя и не дает запроса диапазона):

SELECT * FROM events WHERE name = 'a' AND start_time = 33 and end_time <= 34 and id = '35'; 

Если вы ищете события, происходящие в минуту y, возможно, будет возможна другая модель данных, например, добавление события в каждую минуту, когда событие продолжается, а что нет, или bucketing на основе «hour» или что нет. См. Также https://stackoverflow.com/a/48755855/32453

Смежные вопросы