2013-08-20 10 views
6

In base al seguente tutorial, Hive ha un tipo di mappa. Tuttavia, non sembra esserci un modo documentato per inserire una nuova coppia chiave-valore in una mappa Hive, tramite un SELECT con qualche UDF o una funzione incorporata. È possibile?Come posso inserire una coppia chiave-valore in una mappa alveare?

Come chiarimento, supponiamo di avere una tabella denominata foo con una singola colonna, digitata map, denominata column_containing_map.

Ora voglio creare una nuova tabella che abbia anche una colonna, digitata map, ma voglio che ogni mappa (che è contenuta in una singola colonna) abbia una coppia chiave-valore aggiuntiva.

Una query potrebbe assomigliare a questo:

CREATE TABLE IF NOT EXISTS bar AS 
SELECT ADD_TO_MAP(column_containing_map, "NewKey", "NewValue") 
FROM foo; 

Poi il tavolo bar conterrebbe le stesse mappe come tavolo foo tranne che ogni mappa in bar avrebbe un coppia chiave-valore aggiuntivo.

risposta

0

Mi dispiace, non l'ho capito. Cosa intendi per con alcune UDF o funzione incorporata? Se desideri inserire in una tabella che ha un campo Mappa è simile a qualsiasi altro tipo di dati. Per esempio:

Ho una tabella denominata complex1, creato in questo modo:

CREATE TABLE complex1(c1 array<string>, c2 map<int,string>) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' COLLECTION ITEMS TERMINATED BY '-' MAP KEYS TERMINATED BY ':' LINES TERMINATED BY '\n'; 

ho anche un file, chiamato com.txt, che contiene questo: Mohammad-Tariq, 007: legame

Ora, io gli caricare questi dati in quanto sopra tabella creata:

carico data inpath '/inputs/com.txt' nella tabella complex1;

Quindi questa tabella contiene:

select * from complex1;

OK

[ "Mohammad", "Tariq"] {7: "Bond"}

Tempo impiegato: 0.062 secondi

ho un altro tavolo, denominata complex2:

CREATE TABLE complex2(c1 map<int,string>); 

Ora, per selezionare i dati da complex1 e inserire complex2 farò questo:

inserto nella tabella complex2 seleziona c2 da complex1;

Scansione tabella di cross controllo:

select * from complex2;

OK

{7: "Bond"}

Tempo impiegato: 0.062 secondi

HTH

+0

Ciao Tariq, vedere le mie modifiche alla domanda. – merlin2011

0

penso che la funzione Combina da brickhouse farà quello che vi serve. Modificando leggermente la query nella tua domanda iniziale, sarebbe simile a questa

SELECT 
    combine(column_containing_map, str_to_map("NewKey:NewValue")) 
FROM 
    foo; 

La limitazione con questo esempio è che str_to_map crea una stringa MAPPA <, STRING>. Se la tua mappa alveare contiene altri tipi primitivi per le chiavi o i valori, questo non funzionerà.

3

Considera di avere una tabella studenti che contiene voti degli studenti in varie materie.

hive> desc student; 
id      string 
name     string 
class     string 
marks     map<string,string> 

È possibile inserire i valori direttamente nella tabella come di seguito.

INSERT INTO TABLE student 
SELECT STACK(1, 
'100','Sekar','Mathematics',map("Mathematics","78") 
) 
FROM empinfo 
LIMIT 1; 

Qui la tabella 'empinfo' può essere qualsiasi tabella nel database. E i risultati sono:

100  Sekar Mathematics  {"Mathematics":"78"} 
+1

esempio Tentativo esattamente come dato sul Hive MAPR 5 ed ha ottenuto il seguente errore 'FALLITA: SemanticException [Errore 10293]: Impossibile creare il file temporaneo per i valori di inserimento Espressione di tipo TOK_FUNCTION non supportato in inserimento/values' Senza' mappa 'campo nella struttura della tabella, la query inserisce valore senza problemi –

Problemi correlati