Domanda

Ho problemi con l'utilizzo del tipo time_uuid come chiave nella mia famiglia. Voglio archiviare i miei dischi e farli ordinare da quando sono stati inseriti, e poi ho pensato che il time_uuid è un buon modo per andare. Ecco come ho impostato la mia famiglia di colonne:

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

Quando provo a inserire, lo faccio:

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

Tuttavia, quando inserisco i dati, ricevo sempre un errore:

L'argomento per un nome o un valore della colonna UUID V1 non era né un uuid, un datetime o un numero.

Se cambio comparatore_type in utf8_type, funziona, ma l'ordine degli elementi quando restituiti non è come dovrebbero essere. Che cosa sto facendo di sbagliato?

È stato utile?

Soluzione

Il comparatore per una famiglia di colonne viene utilizzato per ordinare le colonne all'interno di ogni riga. Stai vedendo quell'errore perché "Somedata" è valido UTF-8 ma non un UUID valido.

L'ordinamento delle righe conservate in Cassandra è determinato dal partizionatore. Molto probabilmente stai usando Randompartitioner che distribuisce il carico uniformemente attraverso il cluster ma non consente domande significative (le righe verranno restituite in un ordine casuale.)

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

Altri suggerimenti

Il problema è che nel tuo modello di dati, stai utilizzando il tempo come chiave di riga. Sebbene ciò sia possibile, non otterrai un ordine significativo a meno che tu non usi anche il byteorderdpartitioner.

Per questo motivo, la maggior parte delle persone inserisce i dati ordinati nel tempo usando il tempo come a Nome colonna, non una chiave di riga. In questo modello, la tua dichiarazione di inserto sembrerebbe:

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

dove someKey è una chiave che si riferisce a tutte le serie temporali che stai inserendo (ad esempio un nome utente). (Nota che non è necessario convertire il tempo in Uuid, Pycassa lo fa per te.) Per memorizzare qualcosa di più di un singolo valore, utilizzare una supercolumn o una chiave composita.

Se vuoi davvero archiviare l'ora nelle chiavi della riga, allora devi specificare key_validation_class, non comparator_type. comparator_type imposta il tipo di nomi di colonne, mentre key_validation_class Imposta il tipo di chiavi di riga.

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

Ricorda che le righe non verranno ordinate a meno che tu non usi anche il byteorderdpartitioner.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top