2013-07-03 11 views
10

Prima CQL3 si potrebbe inserire colonne arbitrarie come le colonne che sono denominati da una data:Inserimento di colonne arbitrarie a Cassandra utilizzando CQL3

cqlsh:test>CREATE TABLE seen_ships (day text PRIMARY KEY) 
       WITH comparator=timestamp AND default_validation=text; 
cqlsh:test>INSERT INTO seen_ships (day, '2013-02-02 00:08:22') 
       VALUES ('Tuesday', 'Sunrise'); 

Per this post sembra che le cose sono diverse in CQL3. È ancora possibile in qualche modo inserire colonne arbitrarie? Ecco il mio tentativo fallito:

cqlsh:test>CREATE TABLE seen_ships (
    day text, 
    time_seen timestamp, 
    shipname text, 
    PRIMARY KEY (day, time_seen) 
); 

cqlsh:test>INSERT INTO seen_ships (day, 'foo') VALUES ('Tuesday', 'bar'); 

Qui ricevo Bad Request: line 1:29 no viable alternative at input 'foo'

Quindi cerco un tavolo un po 'diverso, perché forse questa è una limitazione di chiavi composte:

cqlsh:test>CREATE TABLE seen_ships (day text PRIMARY KEY); 
cqlsh:test>INSERT INTO seen_ships (day, 'foo') VALUES ('Tuesday', 'bar'); 

Sempre con l'Bad Request: line 1:29 no viable alternative at input 'foo'

Cosa mi manca qui?

risposta

15

C'è un buon blog post nel blog sulla Datastax su questo: http://www.datastax.com/dev/blog/does-cql-support-dynamic-columns-wide-rows

La risposta è che sì, CQL3 supporta colonne dinamici, non solo il modo in cui ha funzionato nelle versioni precedenti di CQL. Non capisco il tuo esempio, mescoli i datestamp con le stringhe in un modo che non vedo come ha funzionato in CQL2. Se ti capisco correttamente, vuoi fare una cronologia degli avvistamenti di navi, dove la chiave di partizione (tasto di riga) è il giorno e ogni avvistamento è una coppia di tempo/nome. Ecco un suggerimento:

CREATE TABLE ship_sightings (
    day TEXT, 
    time TIMESTAMP, 
    ship TEXT, 
    PRIMARY KEY (day, time) 
) 

E si inserisce voci con

INSERT INTO ship_sightings (day, time, ship) VALUES ('Tuesday', NOW(), 'Titanic') 

tuttavia, probabilmente si dovrebbe utilizzare un TIMEUUID invece di TIMESTAMP (e la chiave primaria potrebbe essere un DATE), dal momento che altrimenti si potrebbe aggiungere due avvistamenti con lo stesso timestamp e solo uno sopravvivrà.

Questo era un esempio di righe larghe, ma poi c'è il problema delle colonne dinamiche, che non è esattamente la stessa cosa. Ecco un esempio di quello CQL3:

CREATE TABLE ship_sightings_with_properties (
    day TEXT, 
    time TIMEUUID, 
    ship TEXT, 
    property TEXT, 
    value TEXT, 
    PRIMARY KEY (day, time, ship, property) 
) 

che è possibile inserire in questo modo:

INSERT INTO ship_sightings_with_properties (day, time, ship, property, value) 
VALUES ('Sunday', NOW(), 'Titanic', 'Color', 'Black') 
# you need to repeat the INSERT INTO for each statement, multiple VALUES isn't 
# supported, but I've not included them here to make this example shorter 
VALUES ('Sunday', NOW(), 'Titanic', 'Captain', 'Edward John Smith') 
VALUES ('Sunday', NOW(), 'Titanic', 'Status', 'Steaming on') 
VALUES ('Monday', NOW(), 'Carapathia', 'Status', 'Saving the passengers off the Titanic') 

L'aspetto negativo di questo tipo di colonne dinamiche è che i nomi di proprietà saranno memorizzati più volte (in modo se hai mille avvistamenti di fila e ognuno ha una proprietà chiamata "Capitano", quella stringa viene salvata migliaia di volte). La compressione su disco elimina la maggior parte di questo sovraccarico e la maggior parte delle volte non è nulla di cui preoccuparsi.

Infine una nota sulle raccolte in CQL3. Sono una funzionalità utile, ma non sono un modo per implementare righe o colonne dinamiche di grandi dimensioni. Prima di tutto hanno un limite di 65536 articoli, ma Cassandra non può applicare questo limite, quindi se aggiungi troppi elementi potresti non essere in grado di leggerli più tardi. Le raccolte sono principalmente per piccoli campi multivalore - l'esempio canonico è una rubrica in cui ogni riga è una voce e le voci hanno un solo nome, ma più numeri di telefono, indirizzi e-mail, ecc.

+0

Le chiamate multiple a "NOW()" non creeranno valori diversi? Quindi le chiavi per ogni oggetto Titanic saranno diverse? –

+0

In questo caso vogliamo che i valori siano diversi, sono ID per diversi eventi. Tuttavia, IIRC Cassandra e la maggior parte dei database valuterà il valore di 'NOW()' una volta per ogni istruzione (il che non significa che gli ID saranno uguali, 'NOW()' restituisce un 'TIMEUUID', che è univoco ma contiene anche un timestamp, quindi 'NOW()' e 'NOW()' nella stessa istruzione creeranno due distinti valori 'TIMEUUID' con componenti di tempo identici). – Theo

0

Non è colonna veramente dinamica, ma la maggior parte delle volte è possibile farla franca con le raccolte.Utilizzando la colonna Mappa è possibile memorizzare alcuni dati dinamici

+1

-1 Come non è la colonna "veramente dinamica"? Nessuna spiegazione fornita. E la raccolta è una sostituzione inadeguata per i dati dinamici con una vasta gamma. – maulik13

Problemi correlati