2016-10-03 2 views
1

Bonjour je lisais la documentation Cassandra sur la fonction Token,Comprendre la fonction de jeton Cassandra

Screenshot of documentation, https://docs.datastax.com/en/cql/3.1/cql/cql_using/paging_c.html

Je suis en train de réaliser une table pagination pour Cassandra, je suis incapable de comprendre les lignes mises en évidence. Le document parle de la différence entre k> 42 et TOKEN (k)> TOKEN (42), mais je ne suis pas capable de comprendre la "comparaison basée sur les jetons"

En attendant une explication détaillée de la fonction de jeton lorsque partie d'une clause WHERE.

Répondre

8

Afin de comprendre dans lequel partition il faut mettre vos données, C * fait quelques calculs sur les PARTITION KEY s de chaque ligne. Plus précisément, sur chaque nœud, les lignes sont triées par le jeton généré par le partitionneur (et chaque partition a des données triées par la clé de cluster). Différents partitioners effectuer différents types de calculs.

Alors que le Murmur3Partitioner calcule la MurmurHash de la touche déstiné, le ByteOrderedPartitioner utilise les octets de données brutes de la clé de partition elle-même: lorsque vous utilisez le Murmur3Partitioner, vos lignes sont triées par leurs hash, alors que lorsque vous utilisez le ByteOrderedPartitioner, vos lignes sont triées directement par leurs valeurs brutes.

À titre d'exemple, supposons que vous avez une table comme ceci:

CREATE TABLE test (
    username text, 
    ... 
    PRIMARY KEY (username) 
); 

Et supposons que vous essayez de trouver où les lignes correspondant aux noms d'utilisateur et abcdabce et abcf sont stockés. La représentation hexadécimale de ces chaînes est 0x61626364 et 0x61626365 et 0x61626366 respectivement. En supposant que nous appliquons cette implémentation MH3 (x86, 32 bits pour plus de simplicité, pas de graine facultative) sur les deux chaînes, nous obtenons ‭0x‭43ED676A‬‬ et 0x‭‭E297E8AA‬‬ et 0x‭‭87E62668‬‬ respectivement. Ainsi, dans le cas de MH3, les jetons des chaînes seront ces 3 valeurs, alors que dans le cas du BOP, les jetons seront les valeurs de données brutes elles-mêmes: 0x61626364, 0x61626365 et 0x61626366.

Vous pouvez maintenant voir que le stockage des données triées par token produit des résultats différents lorsque différents partitions sont utilisées. Une requête SELECT * FROM test; retournerait des lignes dans un ordre différent. Cette peut (mais ne devrait pas) être un problème si vous avez des données déjà triées par leurs valeurs brutes et vous devez récupérer que dans le même ordre que lorsque vous utilisez MH3 l'ordre est complelety sans rapport avec vos données.

Retour à la question, la fonction TOKEN vous permet de filtrer directement par les jetons de vos données au lieu de vos données. Le documentation dit:

commande avec la fonction TOKEN ne fournit pas toujours les attendus résultats. Utilisez la fonction TOKEN pour exprimer une relation conditionnelle sur une colonne de clé de partition . Dans ce cas, la requête renvoie des lignes basées sur le jeton de la clé de partition plutôt que sur la valeur.

À titre d'exemple, vous pouvez émettre:

SELECT * FROM test WHERE TOKEN(username) <= TOKEN('abcf'); 

et vous obtiendriez comprendre quoi? abcd et acbf rangées !!! C'est parce que l'ordre parfois des questions ... Comme dans le cas de la pagination que vous essayez de faire, qui sera traitée sans faille pour vous par un pilote C * disponible (par exemple le Java driver). Cela dit, le partitionneur recommandé pour les nouveaux clusters est Murmur3Partitioner, vous pouvez vérifier le documentation pour les avantages et les inconvénients de chaque partitionneur. S'il vous plaît noter que le partitionneur est un paramètres de cluster à l'échelle, et une fois défini, vous ne pouvez pas le changer sans pousser toutes vos données dans un autre cluster.

Faites votre choix avec soin.

+0

Certainement la réponse que je cherche –

+0

quelle est la différence dans l'ordre de tri d'un noeud et d'une partition. Je crois que chaque partition d'une table a un noeud dédié –

2

Les données Cassandra sont partitionnées en fonction des codes Token de la ligne PartitionKey. Le token est gerenated en utilisant une fonction de hachage. La fonction Token génère la valeur qui aurait été créée en appliquant la fonction de hachage à ses arguments.

Cela dit, presque tous les pilotes sont maintenant automatiquement mis en page par défaut.