2013-04-15 3 views
14

Sto cercando di creare una tabella colonna larga, 20.000 colonneselezionare il valore specifico da mappa

Inizialmente stavo pensando che avrei usato:

CREATE TABLE details (
    key TEXT, 
    detail map<TEXT, TEXT> 
    PRIMARY KEY (KEY) 
); 

Inserimento in questa tabella funziona bene

UPDATE details SET detail = detail + { 'col1': '12'} where key='123' ; 
UPDATE details SET detail = detail + { 'col20000': 'ABCD'} where key='123' ; 

Tuttavia, vorrei leggere un singolo dettaglio:

select detail[col1] where key='123' 

durante l'esecuzione di questa query ottengo il seguente errore:

no viable alternative at input '[' 

Sarà questo lavoro, o ho bisogno di un approccio diverso?

risposta

6

Fondamentalmente questa funzionalità non è ancora supportata da cassandra.

vedere questo cql3 collections

12

raccolte sono piccoli gruppi di dati che recuperano tutto in una volta.

Se si desidera accedere tuple ad un livello più fine, ed essere ancora in grado di chiedere "che cosa sono tutte le coppie di dati per una determinata chiave," è necessario utilizzare una tabella come questa:

CREATE TABLE details (
    key TEXT, 
    detail_key text, 
    detail_value text, 
    PRIMARY KEY (key, detail_key) 
); 

Ciò consentirà SELECT * FROM details WHERE key = ? e SELECT * FROM detail WHERE key = ? AND detail_key = ?.

+0

Grazie, questo è l'approccio che ho preso. – e90jimmy

+0

Ancora non lo vedo 3.9, chiedo quale sia la ragione, non riuscendo a trovarlo. AFAIK, sono memorizzati come colonne stesse. "Le letture parziali delle colonne di raccolta non sono possibili in CQL. L'unico modo per recuperare i dati da una raccolta è leggere la raccolta nella sua interezza, per questo motivo è generalmente poco pratico archiviare dataset grandi e illimitati all'interno di una colonna di raccolta" https://github.com/apache/cassandra/blob/cassandra-3.6/CHANGES.txt – kisna