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 abcd
abce
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 0x43ED676A
et 0xE297E8AA
et 0x87E62668
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.
Certainement la réponse que je cherche –
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é –