2015-03-19 3 views
-1

В этой таблице los.configuration имеет ключ раздела, состоящий из 3 столбцов (1. groupname 2. class 3.yearofjoining). Могут быть 2 класса BPL и APL. Я хочу выбрать эти две категории из базы данных.Cassandra Выбрать запрос

Так что я должен использовать запрос:

SELECT * FROM CONFIGURATION WHERE GROUPNAME = 332 
AND CLASS IN ('APL','BPL') AND YEAROFJOINING IN (2014,2015); 

Когда я пытаюсь этот запрос он возвращающую ошибку как

Partition KEY часть класса не может быть ограничено в связи (только последняя часть ключа раздела может).

Любая идея, в чем проблема?

+0

'Это не работает', это не очень хороший вопрос. Как это не работает? И ваша проблема очень возможна, потому что вы не добавляете пространство ключей в свое семейство столбцов. Попробуйте с помощью 'select * from keyspace.table, где condition1 = something', и посмотрите, работает ли это. – kha

+0

Вы пытаетесь использовать условие ИЛИ в своем предложении where? http://stackoverflow.com/questions/10139390/alternative-for-or-condition-after-where-clause-in-select-statement-cassandra –

+0

SELECT * from TABLE, где условие1 = что-то или условие1 = что-то – Getz

ответ

1

Основная проблема здесь в том, что вы пытаетесь использовать отношение IN на двух частях composite partition key. IN может работать только с последним частью раздела или ключа кластеризации.

Чтобы получить запрос на работу, ваш PRIMARY KEY нужно будет разделить на GROUPNAME и CLASS, в то время как кластеризация на YEAROFJOINING:

PRIMARY KEY ((groupname, class), yearofjoining)) 

Когда я запрашиваю таблицу с этой PRIMARY KEY, используя исходный запрос:

[email protected]:stackoverflow> SELECT * FROM CONFIGURATION 
    WHERE GROUPNAME = 332 AND CLASS IN ('APL','BPL') 
    AND YEAROFJOINING IN (2014,2015); 

groupname | class | yearofjoining | value 
-----------+-------+---------------+------- 
     332 | APL |   2014 | test1 
     332 | APL |   2015 | test3 
     332 | BPL |   2014 | test2 

(3 rows) 

Дополнительные мысли:

  1. Я не знал, что вы можете использовать отношение IN как на последней части раздела, так и на ключе кластера в том же запросе. Так что я кое-что узнал сегодня!

  2. Я чувствую себя обязанным предупредить вас о том, что использование ключа IN на вашей клавиатуре раздела не работает хорошо (Is the IN relation in Cassandra bad for queries?). На самом деле, запрос нескольких строк, был идентифицирован как анти-шаблон Cassandra.

  3. Чем больше я думаю об этом, тем больше я думаю, что вы получите лучшую производительность, если вы сделаете запрос на slice на YEAROFJOINING (вместо IN). Так что если лет вы хотите найти будет заказ, скажем, 2014 и выше, лучше запрос будет выглядеть так:

    [email protected]:stackoverflow> SELECT * FROM CONFIGURATION WHERE GROUPNAME = 332 AND CLASS IN ('APL','BPL') AND YEAROFJOINING >= 2014;

Это будет быстрее из-за ключа кластеризации на YEAROFJOINING, который будет использовать ваш порядок сортировки на диске.

Смежные вопросы