Ограничение ключа кластеризации для условия IN в cassandra

У меня есть таблица в кассандре:

CREATE TABLE pica_pictures (
  p int,
  g text,
  id text,
  a int,
  PRIMARY KEY ((p), g, id)
)

Затем я пытаюсь выбрать данные с запросом:

cqlsh> select * from picapica_realty.pica_pictures where p = 1 and g in ('1', '2');
Bad Request: Clustering column "g" cannot be restricted by an IN relation

Не могу найти причину такого поведения.


person Evgeny Vanslov    schedule 23.01.2016    source источник
comment
Это допустимо в Cassandra 2.2, если запросом не выбран столбец типа коллекции.   -  person Cedric H.    schedule 23.01.2016
comment
Я нашел документ, описывающий ключевое слово IN ссылка . По ссылке должно работать. A single clustering column can be defined if all preceding columns are defined for either equality or group inclusion.   -  person Evgeny Vanslov    schedule 23.01.2016


Ответы (2)


Это может быть ограничением из-за вашей версии Cassandra. Как заметил Седрик, у него это работает в 2.2 (точнее, не выдавало ошибки).

Однако, когда я читал ваш вопрос, я вспомнил слайд из презентации, которую я сделал на Дне Кассандры в Чикаго в 2015 году. -sql-you-are-looking-for" rel="nofollow">CQL: это не тот SQL, который вам нужен, вариант №15:

В

  • Может работать только с последним ключом раздела и/или последним ключом кластеризации.

В то время (апрель 2015 г.) самой последней версией Cassandra была либо 2.1.4, либо 2.1.5.

В нынешнем виде (с Cassandra 2.1) вам нужно либо настроить определение первичного ключа на PRIMARY KEY ((p), g), либо изменить предложение WHERE на что-то вроде where p = 1 and g = 1 and id in ('id1', 'id2');.

person Aaron    schedule 23.01.2016
comment
Я не знал об этом ограничении, спасибо за ссылку. Что вы имеете в виду под скорее? Это все еще незаконно, но без сообщения об ошибке? - person Cedric H.; 24.01.2016
comment
@СедрикХ. Я хочу сказать, что, хотя ваш ответ дает хорошие результаты, запрос, который возвращает 0 rows, может быть не лучшим индикатором того, что что-то работает. - person Aaron; 24.01.2016

Это связано с Cassandra 2.2.

cqlsh:ks> CREATE TABLE pica_pictures (
          ...   p int,
          ...   g text,
          ...   id text,
          ...   a int,
          ...   PRIMARY KEY ((p), g, id)
          ... );
cqlsh:ks> select * from pica_pictures where p = 1 and g in ('1', '2');

 p | g | id | a
---+---+----+---

(0 rows)

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

person Cedric H.    schedule 23.01.2016