CQL SELECT не может обрабатывать составные столбцы

Я борюсь с cassandra и CQL. Я определяю эту схему таблицы,

CREATE TABLE useradvisits (
  userid text,
  adid int,
  type int,
  timestamp timestamp,
  PRIMARY KEY (userid, adid, type)
 );

Я хочу запросить вот так,

SELECT * from useradvisits where userid = 'user-1' and adId in (100, 1001);

Но он говорит: «Плохой запрос: часть PRIMARY KEY adid не может быть ограничена отношением IN».

Я работаю с последней версией datstax Enterprise 3.1.

консоль cqlsh говорит,

[cqlsh 3.1.2 | Cassandra 1.2.6.1 | CQL spec 3.0.0 | Thrift protocol 19.36.0]

Поскольку мне нужно, чтобы (adId + type) был уникальным, то есть (100: 1), (100: 2) оба присутствовали для пользователя. Может ли кто-нибудь помочь мне, как обойти это?


person Zer001    schedule 15.08.2013    source источник


Ответы (2)


Вы создали составной ключ столбца из adid и type. Вы можете добавить либо к ключу строки, чтобы создать композитум. Просто создайте модель с PRIMARY KEY ((userid, adid), type), и ваш запрос будет работать. Недостаток этого подхода: вам всегда придется указывать файл adid.

Вы также можете сделать обратное и вместо этого добавить тип к ключу строки. Если бы вы заранее знали диапазон «типа», это могло бы работать еще лучше.

person John    schedule 15.08.2013
comment
спасибо, я делаю так .. поскольку тип принимает только 3 разных значения, это выглядит так: CREATE TABLE useradevents (uId varchar, adId int, type int, timestamp timestamp, PRIMARY KEY((uId, type), adId)); Теперь я могу запросить select * from useradeventst, где uid = 'user-1', ввести (1,2) и добавить (102, 101); - person Zer001; 15.08.2013
comment
Недостатком этого является то, что ваш ключ раздела теперь разделен, а это означает, что каждый запрос может нуждаться в отправке на все узлы (тогда как с предыдущей компоновкой только с идентификатором пользователя в качестве ключа раздела нам может не понадобиться выходить на несколько узлов), - person bwawok; 26.03.2015

Я изменил таблицу таким образом, используя составной ключ раздела.

 CREATE TABLE useradevents ( 
    userid varchar,        
    type int, 
    adId int,     
    timestamp timestamp,            
    PRIMARY KEY((userid, type), adId));

Теперь этот запрос работает как шарм. Один думает, что вам нужно ограничить значение типа, которое в моем случае принимает только 3 разных значения.

SELECT * from useradevents where userid = 'user-1' and type = 1 and adId in (100, 1001);

Спасибо @omnibear!

person Zer001    schedule 16.08.2013
comment
Добавьте комментарий к ответу выше вместо создания другого ответа. - person mac; 29.08.2013
comment
У меня не поддерживает хорошее форматирование :( так и надо было сделать - person Zer001; 02.09.2013