2015-12-16 1 views
0

Mon problème principal est de paginer le jeu de résultats Cassandra sur une table avec une clé de partition composite. Cependant, j'essaie de l'affiner avec un scénario simple. Dites, j'ai une table,Requête CQL dans Cassandra avec clé de partition composite

CREATE TABLE numberofrequests (
    cluster text, 
    date text, 
    time text, 
    numberofrequests int, 
PRIMARY KEY ((cluster, date), time) 
) WITH CLUSTERING ORDER BY (time ASC) 

et moi avons des données comme,


cluster | date | time | numberofrequests ---------+------------+------+------------------ c2 | 01/04/2015 | t1 | 1 c2 | d1 | t1 | 1 c2 | 02/04/2015 | t1 | 1 c1 | d1 | t1 | 1 c1 | d1 | t2 | 2

Question: Est-il possible que je peux interroger les données pour le groupe = c2? Je ne me soucie pas de la 'date' et honnêtement, je garde cela uniquement pour le partitionnement afin d'éviter les points chauds. J'ai essayé ce qui suit,


select * from numberofrequests where token(cluster,date)>=token('c2','00/00/0000'); 

select * from numberofrequests where token(cluster,date)>=token('c2','1'); 

select * from numberofrequests where token(cluster,date)>=token('c2','a'); 

select * from numberofrequests where token(cluster,date)>=token('c2',''); 

Mon schéma utilise le partitionneur par défaut (Murmur3Partitioner). Est-ce réalisable du tout?

Répondre

0

Cassandra a besoin de la clé de partitionnement (PK) pour localiser la ligne interrogée. Toutes les requêtes basées uniquement sur des parties du PK ne fonctionneront pas, car son hachage murmur3 ne correspondra pas au hachage basé sur le PK complet initialement créé par le partitionneur. Ce que vous pouvez faire à la place est d'utiliser le ByteOrderedPartitioner. Cela vous permettra d'utiliser la fonction comme dans vos exemples en gardant l'ordre des octets du PK au lieu d'utiliser une fonction de hachage. Mais dans la plupart des cas, c'est une mauvaise idée, car les données ne seront pas réparties uniformément sur le cluster et vous vous retrouverez avec des hotspots que vous avez essayé d'éviter en premier lieu.

+0

Il est intéressant d'ajouter que vous pouvez avoir en clé de clustering une sorte de seau au lieu de la date, par exemple le jour de la semaine. Par conséquent toutes les données se propageraient par "cluster" et le jour de la semaine. Pour récupérer ces données, vous devez envoyer 7 demandes pour un cluster. – piotrwest

+0

Hmm. Au début, j'avais l'impression que la fonction token() est une alternative dans les schémas non ByteOrderedPartitioner, pour mettre à disposition des clés de partition de requête. Cependant, je crois que ce n'est pas le cas. Lorsque j'ai parcouru les documents CQL 3.3 maintenant, il mentionne que «les résultats ne seront pas toujours conformes aux attentes». J'accepterai votre réponse comme la bonne réponse. Maintenant je continue à me demander à quoi sert la fonction token()! –

+0

La fonction 'token()' est la seule façon de travailler avec les plages de clés de partition. L'utilisation de quelque chose comme 'where cluster> 'c2' et la date> '00/00/0000'' n'est simplement pas possible car seule la comparaison égale est autorisée pour les conditions sur le PK. –