Come posso inviare i risultati di una query HiveQL a CSV?

vorremmo mettere i risultati di una query Hive in un file CSV. Ho pensato che il comando dovesse assomigliare a questo:

insert overwrite directory '/home/output.csv' select books from table; 

Quando lo eseguo, dice che è stato completato correttamente ma non riesco mai a trovare il file. Come trovo questo file o dovrei estrarre i dati in un modo diverso?

Grazie!

Sebbene sia ansible utilizzare INSERT OVERWRITE per estrarre i dati da Hive, potrebbe non essere il metodo migliore per il tuo caso specifico. Prima lasciatemi spiegare cosa INSERT OVERWRITE fa, quindi descriverò il metodo che uso per ottenere i file tsv dalle tabelle Hive.

Secondo il manuale , la tua query memorizzerà i dati in una directory in HDFS. Il formato non sarà csv.

I dati scritti sul filesystem sono serializzati come testo con colonne separate da ^ A e righe separate da una nuova riga. Se una delle colonne non è di tipo primitivo, quelle colonne vengono serializzate in formato JSON.

Una leggera modifica (aggiungendo la parola chiave LOCAL ) memorizzerà i dati in una directory locale.

 INSERT OVERWRITE LOCAL DIRECTORY '/home/lvermeer/temp' select books from table; 

Quando eseguo una query simile, ecco come appare l’output.

 [[email protected] temp]$ ll total 4 -rwxr-xr-x 1 lvermeer users 811 Aug 9 09:21 000000_0 [[email protected] temp]$ head 000000_0 "row1""col1"1234"col3"1234FALSE "row2""col1"5678"col3"5678TRUE 

Personalmente, di solito eseguo la mia query direttamente tramite Hive sulla riga di comando per questo tipo di cose, e le canalizzo nel file locale in questo modo:

 hive -e 'select books from table' > /home/lvermeer/temp.tsv 

Questo mi dà un file separato da tabulazioni che posso usare. Spero che sia utile anche per te.

Sulla base di questa patch-3682 , sospetto che sia disponibile una soluzione migliore quando si utilizza Hive 0.11, ma non sono in grado di testarlo da solo. La nuova syntax dovrebbe consentire quanto segue.

 INSERT OVERWRITE LOCAL DIRECTORY '/home/lvermeer/temp' ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' select books from table; 

Spero possa aiutare.

Se vuoi un file CSV, puoi modificare le soluzioni di Lukas come segue (assumendo che tu sia su una macchina Linux):

 hive -e 'select books from table' | sed 's/[[:space:]]\+/,/g' > /home/lvermeer/temp.csv 

È necessario utilizzare l’istruzione CREATE TABLE AS SELECT (CTAS) per creare una directory in HDFS con i file contenenti i risultati della query. Dopodiché dovrai esportare quei file da HDFS sul tuo normale disco e unirli in un unico file.

Potrebbe anche essere necessario eseguire alcuni trucchi per convertire i file da “\ 001” – delimitato in CSV. È ansible utilizzare un SerDe CSV personalizzato o poscanvasborare il file estratto.

Se stai usando HUE, questo è abbastanza semplice. Basta andare sull’editor Hive in HUE, eseguire la query hive, quindi salvare il file dei risultati localmente come XLS o CSV oppure salvare il file dei risultati su HDFS.

Stavo cercando una soluzione simile, ma quelli menzionati qui non funzionerebbero. I miei dati avevano tutte le variazioni di caratteri e virgole di spazi bianchi (spazio, nuova riga, tabulazione).

Per rendere sicuri i dati della colonna tsv, ho sostituito tutti i caratteri \ t dei dati della colonna con uno spazio e ho eseguito il codice python sulla riga di comando per generare un file csv, come mostrato di seguito:

 hive -e 'tab_replaced_hql_query' | python -c 'exec("import sys;import csv;reader = csv.reader(sys.stdin, dialect=csv.excel_tab);writer = csv.writer(sys.stdout, dialect=csv.excel)\nfor row in reader: writer.writerow(row)")' 

Questo ha creato un csv perfettamente valido. Spero che questo aiuti chi viene a cercare questa soluzione.

È ansible utilizzare la funzione di stringa hive CONCAT_WS( string delimiter, string str1, string str2...strn )

per esempio:

 hive -e 'select CONCAT_WS(',',cola,colb,colc...,coln) from Mytable' > /home/user/Mycsv.csv 

Puoi usare INSERTDIRECTORY …, come in questo esempio:

 INSERT OVERWRITE LOCAL DIRECTORY '/tmp/ca_employees' SELECT name, salary, address FROM employees WHERE se.state = 'CA'; 

OVERWRITE e LOCAL hanno le stesse interpretazioni di prima e i percorsi sono interpretati seguendo le solite regole. Uno o più file verranno scritti in /tmp/ca_employees , a seconda del numero di riduttori richiamati.

Ho avuto un problema simile ed è così che sono stato in grado di affrontarlo.

Passaggio 1 : caricamento dei dati dalla tabella Hive in un’altra tabella come indicato di seguito

 DROP TABLE IF EXISTS TestHiveTableCSV; CREATE TABLE TestHiveTableCSV ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n' AS SELECT Column List FROM TestHiveTable; 

Passaggio 2 – Copiato il blob dal magazzino Hive nella nuova posizione con l’estensione appropriata

 Start-AzureStorageBlobCopy -DestContext $destContext -SrcContainer "Source Container" -SrcBlob "hive/warehouse/TestHiveTableCSV/000000_0" -DestContainer "Destination Container" -DestBlob "CSV/TestHiveTable.csv" 

Il separatore predefinito è ” ^A “. In linguaggio Python, è ” \x01 “.

Quando voglio cambiare il delimitatore, uso SQL come:

 SELECT col1, delimiter, col2, delimiter, col3, ..., FROM table 

Quindi, considerare il delimitatore + ” ^A ” come un nuovo delimitatore.

Simile alla precedente risposta di Ray, Hive View 2.0 in Hortonworks Data Platform consente anche di eseguire una query Hive e quindi salvare l’output come csv.