2016-03-01 1 views
1

У меня есть эта таблица:Cassandra порядок и кластеризация ключа

CREATE TABLE custumer_events_service.events_by_websiteId_time(
    "event_id" text, 
    "currentTime" timestamp, 
    "websiteId" varchar, 

    OTHER COLUMNS ... 

    PRIMARY KEY(event_id, websiteId, currentTime) 
) 

В этом случае, я мог бы получить 10000 строк заказанных currentime, когда я выполнить этот запрос:

SELECT * FROM events_by_websiteid_time WHERE websiteid='xxxx' LIMIT 10000 ALLOW FILTERING; 

Или же я должен добавить WITH CLUSTERING ORDER BY (currentTime DESC); в конце?

ответ

3

Cassandra может только обеспечить порядок сортировки в разделе. Поскольку вы используете ALLOW FILTERING, чтобы избежать необходимости предоставить ваш ключ раздела (event_id), ваш результирующий набор будет упорядочен по значениям хеш-маркеров каждого event_id, а затем по websiteid и currentTime.

Для того, чтобы ваши результаты заказывали currentTime, вам необходимо создать новую таблицу запросов или изменить определение PRIMARY KEY (и, возможно, ЗАКЛАД КЛАСТЕРА) вашей существующей таблицы. Если вы решили создать новую таблицу запроса, он должен выглядеть примерно так:

CREATE TABLE custumer_events_service.events_by_websiteId_time_eventid(
    event_id text, 
    currentTime timestamp, 
    websiteId varchar, 

OTHER COLUMNS ... 

    PRIMARY KEY (websiteid,currentTime,event_id)) 
WITH CLUSTERING ORDER BY (currentTime DESC, event_id ASC); 

Это позволило бы этот вопрос:

SELECT * FROM events_by_websiteid_time_eventid WHERE websiteid='xxxx' LIMIT 10000; 

... работать, как вы ожидаете.

+0

+1 Спасибо за ваш ответ Aron (еще раз ;-)), каковы минусы первого решения (используя CLUSTERING ORDER)? во втором решении я не рискую дисбалансом своего кластера, поскольку у меня есть неэквивалентное распределение событий по сайту? – farhawa

+0

@farhawa Нижняя сторона первого решения заключается в дублировании ваших данных в новой таблице запросов. Но если вам нужно обслуживать запросы для ключей как «websiteid», так и «event_id», вам могут понадобиться обе таблицы ... торговый диск для производительности. Что касается дисбаланса во 2-м решении, если это резкое различие, то, возможно, имеет смысл добавить дополнительное «ведро», чтобы помочь разбивать ваши данные как день или месяц, или что-то еще, что имеет смысл для вашего случая использования. – Aaron

+0

Как я изучаю кассандру, я опубликовал новый вопрос http://stackoverflow.com/questions/35880249/cassandra-the-same-query-work-with-cql-but-not-with-python-driver, который вы можете взглянуть? заранее спасибо – farhawa

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

  • Нет связанных вопросов^_^