2014-12-23 13 views
5

Ho una tabella come questa in CQL3Aggiungere colonne dinamicamente in Cassandra

create table product_info 
(
key text, 
value text, 
Primary key (key) 
); 

Si tratta di una tabella verticale. Dal momento che posso inserire nuove righe con coppia (chiave, valore).

dati campione sarà:

PRODUCT_INFO

key    |  value  
    ------------------------------------------- 
    product_name  | sample_product 
    quantity   | 2 
    manufacture  | sample_manufacturer 
    ....     .... 

Ma quello che mi serve è una tavola orizzontale, dove ho potuto in grado di aggiungere colonne dinamicamente senza alterare la tavola.

PRODUCT_INFO

product_name  | quantity | manufacture   | .... 
    ------------------------------------------------------------------------------  
    sample_product | 2   | sample_manufacturer | .... 

Ho bisogno della struttura come la tabella di cui sopra, hanno bisogno di continuare a aggiungere le colonne al volo.

CQL3 offre un'opzione per aggiungere colonne in modo dinamico, ma prima dobbiamo modificare la tabella.

Ho bisogno di sapere c'è qualche altro metodo che permetta questo.

Ho scoperto che utilizzando la parsimonia di risparmio è possibile, ma dal momento che la parsimonia non è più supportata, non è possibile utilizzarla.

C'è qualche altra API come hector o qualsiasi altra cosa che supporti questo?

Ho seguito i post di overflow dello stack simili, ma non ho ottenuto una soluzione migliore.

+0

Il mio primo pensiero è stato: Lo state facendo ™ sbagliato. Cassandra è già un negozio chiave/valore e in grado di gestire questo esatto scenario OOTB. Essenzialmente si sta simulando un archivio di chiavi/valori all'interno di un altro negozio di chiavi/valori, il che non ha molto senso, IMHO. Quindi il secondo approccio è esattamente quello che dovresti fare e ciò che Cassandra è in grado di fare comunque se lo usi correttamente. Il primo approccio è solo quello di complicare le cose semplici. – JensG

risposta

3
CREATE TABLE product_info(
    product_name text, 
    key text, 
    value text, 
    PRIMARY KEY (product_name, key) 
); 

Ora è possibile inserire fino a 2B coppie k/v perché la chiave è ora la colonna di raggruppamento.

INSERT INTO product_info (product_name, key, value) 
    VALUES ('iPhone 6', 'quantity', '2'); 

INSERT INTO product_info (product_name, key, value) 
    VALUES ('iPhone 6', 'manufacturer', 'Apple'); 

INSERT INTO product_info (product_name, key, value) 
    VALUES ('iPhone 6', 'quantity', '2'); 

INSERT INTO product_info (product_name, key, value) 
    VALUES ('iPhone 6', 'another column name', 'another column value'); 

Tuttavia, non ha specificato i tuoi modelli di accesso di query, quindi questo modello di dati può essere del tutto sbagliato (o OK) per l'applicazione.

+0

La risposta sembra buona per lo scenario normale. Ma ancora la tabella dei risultati è verticale. Ho bisogno di un tavolo di ridimensionamento orizzontale. Ad esempio, ogni nuovo valore deve essere aggiunto come colonna, non come riga. –

+1

Ciao Sunjith, C * è ampia colonna. Le "righe" sono solo un'astrazione CQL della sottostante colonna larga fisica. Se guardi i dati in 'cassandra-cli' vedrai che c'è una singola chiave di partizione seguita da colonna dopo colonna. Le "righe verticali" in CQL sono colonne fisicamente larghe. CQL non è nient'altro che un'astrazione che visualizza le colonne larghe fisiche come righe verticali (simili, ma non le stesse di un CTE in un RDBMS). –

+0

@AkbarAhmed Non penso che la risposta sia pertinente alla sua domanda. Nel suo esempio, non gli importa come i dati verranno effettivamente memorizzati sul disco.Se selezioni da tale CF, vedrai comunque una tabella verticale. Sta chiedendo come aggiungere colonne a una riga. Ad esempio, potrebbe voler avere versioni di firma come nuove colonne senza valori. In questo esempio, se si seleziona tale CF, si otterrà un'ampia fila di dati. Per quanto ne so, non è più possibile con CQL3. – I4004

0

Hai mai pensato di utilizzare una mappa?

create table products(
id text primary key, 
something text, 
attributes map<text, text> 
); 

vedere la fine del http://www.datastax.com/documentation/cql/3.1/cql/cql_using/use_collections_c.html

+0

Sì, ho attraversato la mappa. Ma non penso che sia la soluzione migliore. Dal momento che non è come quello che è la mia aspettativa .. –

+0

Qual è la tua aspettativa? È possibile aggiungere nuove chiavi con valori al volo ed è possibile aggiornare il valore per una chiave. Internamente, cassandra mantiene le mappature in modo da poter pensare in termini di astrazione della mappa. – ashic

Problemi correlati