2015-06-26 9 views
0

Извините, если это дубликат, я нашел несколько вопросов о временных диапазонах здесь, но мой случай кажется немного другим и еще не обсуждался.Запросы Ranges (интервалы) в Cassandra DB - CQL

Я хотел бы хранить довольно большие куски (бункера) данных (BLOB - 2-4Mb, это «черный ящик данные», я не могу изменить его расположение), чтобы получить доступ с интервальными ключами:

... 
primary key (bin_id int, from_item_id int, to_item_id int) 
... 

с возможностью выбора с элементами диапазонов, как в этом псевдокоде, чтобы выбрать все куски, которые содержат интервал элементов [110, 200]:

select chunk from tb1 where chunk_id = 100500 and from_item_id >= 110 and to_item_id <= 200; 

Попытка запустить такой запрос напрямую с ошибкой:

code=2200 [Invalid query] message="PRIMARY KEY column "to_item_id" cannot be restricted (preceding column "from_item_id" is restricted by a non-EQ relation)" 

В настоящее время единственное решение я нашел осуществить дополнительную таблицу (tb_map) с обратным отображением из item_id в bin_id и использовать выбор, чтобы сделать запрос выглядит примерно так:

... 
– in tb_map 
primary key (dummy_id, item_id) 
... 
select bin_id from tb_map where dummy_id = SOME_MAGIK and item_id >= 110 and item_id <= 200; 

И затем использовать bin_id извлекать куски из ТВ1 с эквалайзером или IN оператора, как здесь:

select * from tb1 where bin_id in (...); 

Но я не могу использовать эти проблемы производительности модель из-за вставки (приложение следует избегать много вставок дополнительной таблицы и следует избегать м требующие дополнительных структур данных, но должны быть «такими же простыми, как гвоздь»).

Это простое решение остаться в пределах одного стола (или нескольких простых таблиц)? Я не задумываюсь о том, как моделировать такое поведение в C * (может быть, нужно использовать срезы?), Могут ли локальные C * гуру давать какие-либо подсказки?

Я использую CQL 3.1

+1

Возможный дубликат http://stackoverflow.com/questions/28565470/cassandra-primary-key-column-cannot-be-restricted – TheGeorgeous

ответ

0

От CQL3 reference:

Moreover, for a given partition key, the clustering columns induce an ordering of rows and relations on them is restricted to the relations that allow to select a contiguous (for the ordering) set of rows.

В вашем случае запрос не выбирает непрерывный набор строк, поэтому Cassandra отказывается обрабатывать его.