2013-10-07 5 views
5

Как проверить, является ли значение поля непервичного ключа «A» или «B» с запросом Cassandra CQL? (Я использую Cassandra 2.0.1)Cassandra CQL-запрос проверяет несколько значений

Вот определение таблицы:

CREATE TABLE my_table (
    my_field text, 
    my_field2 text, 
    PRIMARY KEY (my_field) 
); 

Я пробовал:

1> SELECT * FROM my_table WHERE my_field2 IN ('A', 'B'); 

2> SELECT * FROM my_table WHERE my_field2 = 'A' OR my_field = 'B' ; 

Первый не смог с этим messeage:

Bad Request: IN predicates on non-primary-key columns (my_field2) is not yet supported 

Вторая неудача, потому что Cassandra CQL не поддерживает OR ключевое слово

Я не мог заставить этот простой запрос работать (с довольно простым способом). Я очень расстроен, имея дело с CQL-запросами в целом. Это потому, что Кассандра недостаточно зрелая и имеет очень плохую поддержку с запросами, или это я должен изменить образ мышления?

ответ

7

Это намеренная функциональность cassandra. Вы не можете запросить с помощью ИНЕКЕ на колоннах, которые не

  • ключ раздела
  • часть составного ключа

Это происходит потому, что ваши данные разделены вокруг кольца Кассандры узлов. Вы хотите, чтобы вы не попросили все кольцо вернуть ответ на ваш запрос. В идеале вы хотите получить данные из одного узла в кольце

Как правило, в кассандре вы хотите структурировать таблицу в соответствии с вашими запросами в отличие от реляционной нормализации. Поэтому у вас есть несколько вариантов решения этой проблемы.

1) Напишите свои данные в несколько таблиц для поддержки различных запросов. В вашем случае вы можете создать вторую таблицу как

CREATE TABLE my_table (
    my_field2 text, 
    my_field text, 
    PRIMARY KEY (my_field2) 
); 

Тогда ваш первый запрос будет возвращать правильно

2) Создать таблицу с составным ключом как

CREATE TABLE my_table (
    my_field text, 
    my_field2 text, 
    PRIMARY KEY (my_field, my_field2) 
); 

С помощью этого метода , если вы не укажете значение запроса для my_field, тогда вам нужно добавить свой запрос с помощью квалификатора, чтобы сообщить cassandra, что вы действительно хотите запросить все кольцо

SELECT * FROM my_table WHERE my_field2 IN ('A', 'B') ALLOW FILTERING; 

-edit-

Вы не можете использовать вторичный индекс для поиска нескольких значений. За CQL документации

http://www.datastax.com/documentation/cql/3.0/webhelp/cql/ddl/ddl_primary_index_c.html

«Индекс представляет собой структуру данных, которая позволяет быстро, эффективно поиска данных, соответствующих заданному условию.»

Итак, вы должны дать ему одно и только одно значение.

+0

Спасибо за ваш ответ.Однако номер 3 (с явным индексом) не работает. – user2122264

+0

Для номера 2 он, вероятно, может быть использован в качестве обходного пути в некоторых простых случаях. Но, с другой стороны, это может создать новые проблемы: 1> при вставке, если вы дадите новое значение my_field2, оно создаст новую строку в таблице вместо обновления строки, таблица может стать больше и больше , 2> что делать, если я хочу делать такие же запросы для my_field3, my_field4, ... my_fieldn. Если я все эти столбцы в одной таблице, как мне указать первичные ключи (кажется, это будет грязно)? Или я должен создать отдельную таблицу для каждого из «my_field»? – user2122264

+1

часто вы обнаружите, что вы будете писать одни и те же данные в несколько таблиц в разных формах. Было бы нередко записывать те же данные в 3 ... 4 ... 5 разных таблиц для поддержки различных типов запросов. –

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