2015-01-08 4 views
0

У меня есть таблица событий и вы хотите извлечь первую метку времени (столбец unixtime) для каждого пользователя. Есть ли способ сделать это с помощью одного запроса Cassandra?Cassandra: выбор первой записи для каждого значения индексированного столбца

Схема выглядит следующим образом:

CREATE TABLE events (
id VARCHAR, 
unixtime bigint, 
u bigint, 
type VARCHAR, 
payload map<text, text>, 
PRIMARY KEY(id) 
); 

CREATE INDEX events_u 
    ON events (u); 

CREATE INDEX events_unixtime 
    ON events (unixtime); 

CREATE INDEX events_type 
    ON events (type); 

ответ

1

По вашей схеме, каждый пользователь будет иметь один штамп времени. Если вы хотите, одно событие в записи, рассмотреть следующие вопросы:

PRIMARY KEY (id, unixtime). 

Если предположить, что ваша схема, записи для пользователя будут храниться в возрастающем порядке UnixTime. Будьте осторожны, хотя ... если это неограниченный поток событий, и у пользователей много событий, раздел для id будет расти и расти. Рекомендуется хранить размеры разделов до десятков или сотен мегабайт. Если вы ожидаете большего, вам нужно начать какую-то форму bucketing.

Теперь, на ваш запрос. Одним словом, нет. Если вы не нажмете раздел (указав ключ раздела), ваш запрос станет широкомасштабным. С небольшими данными он будет работать. Но с большим количеством данных вы получите тайм-ауты. Если у вас есть данные в его текущей форме, я рекомендую вам использовать коннектор Cassandra Spark и Apache Spark для выполнения вашего запроса. Дополнительным преимуществом искрового подключения является то, что если у вас есть узлы cassandra как узлы искровых рабочих органов, из-за локальности вы можете эффективно ударить вторичный индекс без указания ключа раздела (который обычно вызывает запрос с широким диапазоном с проблемами тайм-аута и т. Д.). Вы даже можете использовать Spark, чтобы получить требуемые данные и сохранить их в другой таблице cassandra для быстрого запроса.

+0

Благодарим вас за ответ. Я считаю, что есть недоразумение: 'id' является уникальным идентификатором для события, но это поле' u', которое содержит идентификатор пользователя. Так что, может быть, вы хотели бы предложить «PRIMARY KEY (u, unixtime)»? – fstab

+0

К сожалению, даже после создания «PRIMARY KEY (u, unixtime)» после запуска запроса 'select u, unixtime из событий ORDER BY u, unixtime;' Я получаю ошибку 'code = 2200 [Invalid query] message =" ORDER BY поддерживается только тогда, когда ключ раздела ограничен EQ или IN. »« Любая идея о том, почему это происходит? Благодаря! – fstab

+1

Yup ... упорядочение осуществляется путем группирования столбцов. Поэтому вам нужно попасть в раздел. Если это отчет, используйте Spark, как я рекомендовал выше. – ashic

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