Запрос 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,..) во время фильтрации в противном случае он выдаст ошибку.