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). Я не могу найти никакой документации, которая говорит мне, как это сделать. Является ли это возможным?

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


person Peter Klipfel    schedule 02.08.2013    source источник


Ответы (1)


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

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

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

person Richard    schedule 04.08.2013