Time Uuid Tipo in Pycassa
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?
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.)
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.