Question

Je vais avoir des problèmes avec l'utilisation de la time_uuid type de clé dans mon columnfamily.Je veux stocker mes dossiers, et de les avoir commandés par les quand ils ont été insérés, et puis j'ai compris que l'time_uuid est une bonne façon d'aller.C'est de cette façon que j'ai configurer ma famille de colonne:

sys.create_column_family("keyspace", "records", comparator_type=TIME_UUID_TYPE)

Lorsque j'essaie d'insérer, je fais ceci:

q=pycassa.ColumnFamily(pycassa.connect("keyspace"), "records")
myKey=pycassa.util.convert_time_to_uuid(datetime.datetime.utcnow())
q.insert(myKey,{'somedata':'comevalue'})

Cependant, lorsque j'insère des données, j'obtiens toujours un message d'erreur:

Argument pour une v1 UUID nom de la colonne ou de la valeur n'était ni un UUID, datetime, ou un nombre.

Si je change le comparator_type à UTF8_TYPE, il fonctionne, mais l'ordre des articles retournés ne sont pas comme ils devraient l'être.Ce que je fais mal?

Était-ce utile?

La solution

Le comparateur pour une famille de colonnes est utilisé pour classer les colonnes dans chaque ligne.Vous voyez cette erreur car «somedata» est un utf-8 valide mais pas un uuid valide.

L'ordre des lignes stockées dans cassandra est déterminé par le partitionneur.Vous utilisez très probablement RandomPartitioner qui répartit la charge uniformément sur votre cluster mais ne permet pas de requêtes de plage significatives (les lignes seront renvoyées dans un ordre aléatoire.)

http://wiki.apache.org/cassandra/FAQ#range_rp

Autres conseils

Le problème est que dans votre modèle de données, vous êtes en utilisant le temps comme une touche de ligne.Bien que cela soit possible, vous ne serez pas obtenir un engagement significatif de la commande, sauf si vous utilisez également le ByteOrderedPartitioner.

Pour cette raison, la plupart des gens insérer ordonnées dans le temps des données en utilisant le temps comme un nom de la colonne, pas une touche de ligne.Dans ce modèle, votre instruction insert ressemblerait à:

q.insert(someKey, {datetime.datetime.utcnow(): 'somevalue'})

someKey est une clé qui se rapporte à l'ensemble de la période que vous êtes à l'insertion (par exemple, un nom d'utilisateur).(Notez que vous n'avez pas à convertir le temps de l'UUID, pycassa le fait pour vous.) Pour stocker quelque chose de plus que d'une seule valeur, l'utilisation d'un supercolumn ou une clé composite.

Si vous voulez vraiment pour stocker l'heure de votre ligne de clés, vous devez spécifier key_validation_class, pas comparator_type. comparator_type définit le type de la colonne des noms, alors que key_validation_class définit le type de la rangée de touches.

sys.create_column_family("keyspace", "records", key_validation_class=TIME_UUID_TYPE)

Rappelez-vous les lignes ne seront pas triées, sauf si vous utilisez également le ByteOrderedPartitioner.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top