2013-08-02 2 views
2

Предположим, у меня есть таблица следующего состава.Первичный ключ изменения CQL3

CREATE TABLE rollup (
    hashname text, 
    key text, 
    day timestamp, 
    counter_value counter, 
    PRIMARY KEY (hashname, key, day) 
) WITH 
... 

Я хочу, чтобы выполнить запрос, который выглядит как

SELECT * FROM rollup WHERE hashname='some_namespaced_hash' AND day>='2013-07-15' AND day<='2013-07-25'; 

Однако, это не работает, потому что (я думаю) следующее также имеет отношение к >, < и т.д.

Композитные клавиши означают, что теперь для CQL имеет смысл отображать синтаксис ORDER BY в запросах SELECT, но он по-прежнему не такой гибкий, как вы могли бы использовать, делая специальные запросы в SQL. Предложения ORDER BY могут выбирать только один столбец, и этот столбец должен быть вторым столбцом в составном PRIMARY KEY. Это выполняется даже для таблиц с более чем двумя компонентами столбцов в первичном ключе

и здесь day является третьим столбцом в ключе основного столбца. Единственный способ, которым я могу это сделать, - изменить основной составной ключ на PRIMARY KEY (hashname, day, key). Я не могу найти документацию, которая подскажет мне, как это сделать. Является ли это возможным?

В качестве альтернативы, я пропущу «правильный» способ решить эту проблему/я неправильно истолковал проблему?

ответ

2

Вы правы, единственный способ - переключить порядок вашего первичного ключа. Причина заключается в том, что, в настоящее время, ваши ключи в таком порядке:

hashname1 key1 day1: counter_value111 
hashname1 key1 day2: counter_value112 
hashname1 key2 day1: counter_value121 
hashname1 key2 day2: counter_value122 
hashname1 key3 day1: counter_value131 
hashname1 key3 day2: counter_value132 

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

hashname1 day1 key1: counter_value111 
hashname1 day1 key2: counter_value121 
hashname1 day1 key3: counter_value131 
hashname1 day2 key1: counter_value112 
hashname1 day2 key2: counter_value122 
hashname1 day2 key3: counter_value132 

К сожалению, единственный способ сделать это, чтобы переписать все данные, а не встроенный способ сделать это в Кассандре. Вы можете написать сценарий, чтобы сделать это, читая данные из одного CF, переключаясь вокруг порядка, а затем выписывайте новый CF и переключатель. Если это нужно сделать вживую, это сложнее, но все же возможно.