2016-03-07 1 views
4

J'utilise le code suivant pour la création de la table:Trouver des valeurs distinctes de la colonne de la clef primaire dans CQL Cassandra

CREATE KEYSPACE mykeyspace 
WITH REPLICATION = { 'class' : 'SimpleStrategy', 'replication_factor' : 1 }; 
USE mykeyspace; 
CREATE TABLE users (
    user_id int PRIMARY KEY, 
    fname text, 
    lname text 
); 
INSERT INTO users (user_id, fname, lname) 
    VALUES (1745, 'john', 'smith'); 
INSERT INTO users (user_id, fname, lname) 
    VALUES (1744, 'john', 'doe'); 
INSERT INTO users (user_id, fname, lname) 
    VALUES (1746, 'john', 'smith'); 

Je voudrais trouver la valeur distincte de lname colonne (ce n'est pas une clé primaire). Je voudrais obtenir le résultat suivant:

lname 
------- 
smith 

En utilisant SELECT DISTINCT lname FROM users; Cependant depuis lname n'est pas un PRIMARY KEY je reçois l'erreur suivante:

InvalidRequest: code=2200 [Invalid query] message="SELECT DISTINCT queries must 
only request partition key columns and/or static columns (not lname)" 
cqlsh:mykeyspace> SELECT DISTINCT lname FROM users; 

Comment puis-je obtenir les valeurs distinctes de lname?

Répondre

6

Undefined_variable fait deux bons points:

  • Dans Cassandra, vous devez construire votre modèle de données pour répondre à vos modèles de requête. Cela signifie parfois dupliquer vos données dans des tables supplémentaires, pour atteindre le niveau souhaité de flexibilité des requêtes.
  • DISTINCT ne fonctionne que sur les clés de partition.

Ainsi, une façon d'obtenir ce travail, serait de construire une table spécifique pour soutenir cette requête:

CREATE TABLE users_by_lname (
    lname text, 
    fname text, 
    user_id int, 
    PRIMARY KEY (lname, fname, user_id) 
); 

Maintenant, après que je lance vos opérations d'encartage à cette nouvelle table de requête, cela fonctionne:

[email protected]:stackoverflow> SELECT DISTINCT lname FROm users_by_lname ; 

lname 
------- 
smith 
    doe 

(2 rows) 

Remarques: Dans ce tableau, toutes les lignes avec la même clé de partition (lname) seront triés par fname, comme fname est une clé de cluster. J'ai ajouté user_id comme une clé de cluster supplémentaire, juste pour assurer l'unicité.

4

Il n'existe aucune fonctionnalité de ce type dans Cassandra. DISTINCT n'est possible que sur la clé de partition. Vous devez concevoir votre modèle de données en fonction de vos besoins. Vous devez traiter les données dans la logique d'application (étincelle peut être utile)

+0

Merci. J'utilise SPARK. Pouvez-vous expliquer comment cela peut-il être fait? Je pense que distinct est quelque chose de très commun. N'y a-t-il pas un code prêt dans SPARK (Scala) que je puisse utiliser pour cela? – Avi

+1

Salut ne pas utiliser scala mais voici quelques liens qui peuvent aider http://stackoverflow.com/questions/30959955/how-does-distinct-function-work-in-spark ET http://stackoverflow.com/questions/24312113/efficient-count-distinct-avec-apache-étincelle –