2015-03-19 2 views
-1

Dans ce tableau, los.configuration possède une clé de partition composée de 3 colonnes (1. nom de groupe 2. classe 3.yearofjoining). Il peut y avoir 2 classes BPL et APL. Je veux sélectionner ces deux catégories à partir de la base de données.Cassandra Sélectionnez la requête

donc je dois utiliser la requête:

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

Quand je suis en train cette requête, il retourne une erreur

Partition KEY classe partie ne peut être limitée par la relation (seule la la dernière partie de la clé de partition peut).

Une idée du problème?

+0

"Cela ne fonctionne pas" n'est pas une bonne question. Comment ça ne marche pas? Et votre problème est très probablement parce que vous n'ajoutez pas l'espace de clés à votre famille de colonnes. Essayez-le avec 'select * from keyspace.table où condition1 = quelque chose' et voyez si cela fonctionne. – kha

+0

Essayez-vous d'utiliser une condition OU dans votre clause where? http://stackoverflow.com/questions/10139390/alternative-for-or-condition-after-where-clause-in-select-statement-cassandra –

+0

SELECT * de TABLE où condition1 = quelque chose ou condition1 = quelque chose – Getz

Répondre

1

Le problème principal ici, est que vous essayez d'utiliser une relation IN sur deux parties d'un composite partition key. IN peut uniquement fonctionner sur la dernière partie d'une partition ou clé de clustering.

Pour obtenir votre requête au travail, votre clé primaire devra partition sur GROUPNAME et CLASS, alors que le regroupement sur YEAROFJOINING:

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

Lorsque je questionne votre table avec cette clé primaire, en utilisant votre requête d'origine:

[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) 

pensées supplémentaires:

  1. Je ne savais pas que vous pouviez utiliser une relation IN à la fois sur la dernière partie d'une partition et sur une clé de cluster dans la même requête. J'ai donc appris quelque chose aujourd'hui! Je me sens obligé de vous prévenir que l'utilisation de IN sur votre clé de partition est connue pour ne pas bien fonctionner (Is the IN relation in Cassandra bad for queries?). En fait, l'interrogation multi-rowkey a été identifiée comme un anti-pattern Cassandra.

  2. Plus je pense à celui-ci, plus je pense que vous obtiendrez de meilleures performances si vous faites une requête de tranche sur YEAROFJOINING (au lieu d'un IN). Donc, si les années que vous voulez rechercher sera en ordre, disons 2014 et plus, une meilleure requête fonctionnerait comme ceci:

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

Ce sera plus rapide en raison de la clé de cluster sur YEAROFJOINING, qui tirera parti de votre ordre de tri sur disque.