Оператор IN для не простых атрибутов - PullRequest
0 голосов
/ 12 июня 2019

Могу ли я использовать оператор IN для атрибутов неосновного ключа в Cassandra?Или какие-либо другие методы вместо использования IN в запросе?

SELECT * FROM abc WHERE domain IN ('domain1','domain2') allow filtering;

 Error from server: code=2200 [Invalid query] message="IN predicates on non-primary-key columns (domain) is not yet supported"

1 Ответ

0 голосов
/ 13 июня 2019

можете ли вы порекомендовать какую-либо альтернативу для оператора IN в Кассандре для моих целей?

Помните, что по-прежнему возможно использовать оператор IN для ключа раздела.Он не сказал бы, что рекомендуется , но это должно быть хорошо с небольшим количеством параметров.Во-первых, вам придется перестроить таблицу или создать новую таблицу для поддержки этого запроса.

Поскольку я не знаю вашего точного определения таблицы, я собираюсь сделать некоторые предположения (например, abc_id).

Если вы воссоздали свою таблицу примерно так:

CREATE TABLE abc_by_domain (
  domain TEXT,
  abc_id TEXT,
  value TEXT,
  PRIMARY KEY (domain,abc_id));

Теперь запишите в нее некоторые данные, и тогда это сработает:

SELECT * FROM abc_by_domain  WHERE domain IN ('domain1','domain2');

 domain  | abc_id | value
---------+--------+---------
 domain1 |      1 | 1st row
 domain2 |      2 | 2nd row

(2 rows)

Примечания:

  • Я предположил, что текущий единственный первичный ключ равен abc_id.По сути, я сделал ключ кластеризации, чтобы гарантировать, что базовые строки, теперь разделенные по доменам, будут по-прежнему уникальными.В вашем случае возьмите любой ключевой столбец, обеспечивающий уникальность в таблице abc, и используйте его в качестве ключа кластеризации для достижения той же цели.
  • Согласно моему предупреждению выше, это называется "ключевой запрос ", который является анти-паттерном в Кассандре.Проблема в том, что Cassandra не может гарантировать, что данные двух разделов будут находиться на одном и том же узле, поэтому она, по сути, выбирает координатора и выполняет два запроса за кулисами.По двум параметрам это, наверное, не так уж плохо.Но я бы постарался сохранить это в однозначных числах.
...