Запрос Cassandra CQL проверяет несколько значений
как я могу проверить, является ли значение поля не первичного ключа " A " или " B " с запросом Cassandra CQL? (Я использую Cassandra 2.0.1)
вот определение таблицы:
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 не поддерживает или ключевое слово
Я не мог заставить этот простой запрос работать (с довольно прямым путем). Я довольно разочарован работой с запросами CQL в целом. Это потому, что Кассандра недостаточно зрелая и имеет действительно плохую поддержку с запросами, или это я должен изменить образ мышления?
2 ответов
это преднамеренная функциональность Кассандры. Нельзя запросить с помощью предложения WHERE столбцы, которые не являются
- раздел ключ
- часть составного ключа
это потому, что ваши данные секционированы вокруг кольца узлов cassandra. Вы хотите избежать необходимости просить все кольцо, чтобы вернуть ответ на ваш запрос. В идеале вы хотите, чтобы иметь возможность извлекать данные из одного узла в кольцо
обычно в 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, вам нужно будет добавить свой запрос с квалификатором, чтобы сообщить Кассандре, что вы действительно хотите запросить все кольцо
SELECT * FROM my_table WHERE my_field2 IN ('A', 'B') ALLOW FILTERING;
-edit -
вы не можете использовать вторичный индекс для поиска нескольких значений. Per CQL documentation
http://www.datastax.com/documentation/cql/3.0/webhelp/cql/ddl/ddl_primary_index_c.html
"индекс-это структура данных, которая позволяет для быстрого и эффективного поиска данных, удовлетворяющих заданному условию."
Итак, вы должны дать ему одно и только одно значение.
Если вы хотите использовать свой "my_field2" в качестве фильтра, вы должны создать индекс на "my_field2"
пример:
Create index IndexName on KeyspaceName.TableName(ColumnName);
CREATE INDEX indexOnField2 ON my_table(my_field2)
после этого вы можете фильтровать по my_field2:
пример:
SELECT * FROM my_table WHERE my_field2='ANYTHING THAT YOU WANT'
Примечание: позаботьтесь о своем типе столбца(int, text,..) во время фильтрации в противном случае он выдаст ошибку.