Come esportare una tabella Hive in un file CSV?

Ho usato questa query Hive per esportare una tabella in un file CSV.

INSERT OVERWRITE DIRECTORY '/user/data/output/test' select column1, column2 from table1; 

Il file generato ‘000000_0’ non ha il separatore di virgola

È questo il modo giusto per generare file CSV? Se no, per favore fammi sapere come posso generare il file CSV?

o usa questo

 hive -e 'select * from your_Table' | sed 's/[\t]/,/g' > /home/yourfile.csv 

È anche ansible specificare la proprietà set hive.cli.print.header=true prima di SELECT per assicurarsi che l’intestazione insieme ai dati sia creata e copiata nel file. Per esempio:

 hive -e 'set hive.cli.print.header=true; select * from your_Table' | sed 's/[\t]/,/g' > /home/yourfile.csv 

Se non si desidera scrivere sul file system locale, redirect l’output del comando sed in HDFS utilizzando il comando hadoop fs -put .

Se si utilizza Hive 11 o superiore, è ansible utilizzare l’istruzione INSERT con la parola chiave LOCAL .

Esempio:

 insert overwrite local directory '/home/carter/staging' row format delimited fields terminated by ',' select * from hugetable; 

Si noti che questo può creare più file e si consiglia di concatenarli sul lato client dopo aver terminato l’esportazione.

L’utilizzo di questo approccio significa che non devi preoccuparti del formato delle tabelle di origine, puoi esportare in base a query SQL arbitrarie e puoi selezionare i tuoi delimitatori e i formati di output.

Non è ansible avere un delimitatore per l’output della query, dopo aver generato il report (come hai fatto tu).

puoi cambiare il delimitatore in virgola.

Viene fornito con il delimitatore predefinito \001 (carattere invisibile).

 hadoop fs -cat /user/data/output/test/* |tr "\01" "," >>outputwithcomma.csv 

controlla anche questo

Questo dovrebbe funzionare per te

  • tab separato

     hive -e 'select * from some_table' > /home/yourfile.tsv 
  • separato da virgola

     hive -e 'select * from some_table' | sed 's/[\t]/,/g' > /home/yourfile.csv 

Le versioni recenti di hive vengono fornite con questa funzionalità.

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

in questo modo puoi scegliere il tuo delimitatore e il nome del file. Basta fare attenzione con il ” OVERWRITE ” cercherà di eliminare tutto dalla cartella menzionata.

Ho usato semplici linux shell piping + perl per convertire l’output generato hive da tsv a csv.

 hive -e "SELECT col1, col2, … FROM table_name" | perl -lpe 's/"/\\"/g; s/^|$/"/g; s/\t/","/g' > output_file.csv 

(Ho ottenuto la regex aggiornata perl da qualcuno in StackOverflow qualche tempo fa)

Il risultato sarà come csv regolare:

"col1","col2","col3" … e così via

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

è la risposta corretta.

Se il numero di record è veramente grande, in base al numero di file generati

il seguente comando darebbe solo un risultato parziale.

 hive -e 'select * from some_table' > /home/yourfile.csv 

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 SE ESISTE TestHiveTableCSV; CREATE TABLE TestHiveTableCSV ROW FORMAT DELIMITED FIELDS TERMINATO DA ‘,’ LINEE TERMINATE DA ‘\ n’ COME SELECT Elenco colonne FROM TestHiveTable;

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

Start-AzureStorageBlobCopy -DestContext $destContext -SrcContainer “Contenitore di origine” -SrcBlob "hive/warehouse/TestHiveTableCSV/000000_0" -DestContainer “Contenitore di destinazione” `-DestBlob” CSV / TestHiveTable.csv ”

Spero che questo ti aiuti!

I migliori saluti, Dattatrey Sindol (Datta) http://dattatreysindol.com

Ci sono modi per cambiare il delimitatore predefinito, come mostrato da altre risposte.

Ci sono anche modi per convertire l’output raw in csv con alcuni script bash. Ci sono 3 delimitatori da considerare, non solo \ 001. Le cose diventano un po ‘più complicate quando la tua tabella hive ha mappe .

Ho scritto uno script bash in grado di gestire tutti i 3 delimitatori predefiniti (\ 001 \ 002 e \ 003) dall’hive e generare un csv. La sceneggiatura e altre informazioni sono qui:

Hive Delimitatori predefiniti in formato CSV

I delimitatori di default di Hive sono

 Row Delimiter => Control-A ('\001') Collection Item Delimiter => Control-B ('\002') Map Key Delimiter => Control-C ('\003') 

Ci sono modi per cambiare questi delimitatori quando si esportano le tabelle, ma a volte si può rimanere bloccati per convertirli in csv.

Ecco un rapido script bash in grado di gestire un’esportazione DB segmentata in più file e con i delimitatori predefiniti. Produrrà un singolo file CSV.

Si presume che tutti i segmenti abbiano la convenzione di denominazione 000 * _0

 INDIRECTORY="path/to/input/directory" for f in $INDIRECTORY/000*_0; do echo "Processing $f file.."; cat -v $f | LC_ALL=C sed -e "s/^/\"/g" | LC_ALL=C sed -e "s/\^A/\",\"/g" | LC_ALL=C sed -e "s/\^C\^B/\"\":\"\"\"\",\"\"/g" | LC_ALL=C sed -e "s/\^B/\"\",\"\"/g" | LC_ALL=C sed -e "s/\^C/\"\":\"\"/g" | LC_ALL=C sed -e "s/$/\"/g" > $f-temp done echo "you,can,echo,your,header,here,if,you,like" > $INDIRECTORY/final_output.csv cat $INDIRECTORY/*-temp >> $INDIRECTORY/final_output.csv rm $INDIRECTORY/*-temp 

Altre spiegazioni in sintesi

Qui utilizzando la dir del magazzino Hive è ansible esportare i dati anziché la tabella Hive. prima dare il percorso del magazzino hive e dopo il percorso locale in cui si desidera memorizzare il file .csv Per questo comando è qui sotto: –

 hadoop fs -cat /user/hdusr/warehouse/HiveDb/tableName/* > /users/hadoop/test/nilesh/sample.csv 

Il seguente script dovrebbe funzionare per te:

 #!/bin/bash hive -e "insert overwrite local directory '/LocalPath/' row format delimited fields terminated by ',' select * from Mydatabase,Mytable limit 100" cat /LocalPath/* > /LocalPath/table.csv 

Ho usato il limit 100 per limitare la dimensione dei dati poiché avevo una tabella enorme, ma puoi eliminarla per esportare l’intera tabella.

Se lo fai da Windows puoi usare lo script hivehoney di Python per estrarre i dati della tabella nel file CSV locale.

Lo farà:

  • Accedi all’host bastion.
  • pbrun.
  • kinit.
  • beeline (con la tua richiesta).
  • Salva echo da beeline nel file su Windows.

Esegui in questo modo:

 set PROXY_HOST=your_bastion_host set SERVICE_USER=you_func_user set LINUX_USER=your_SOID set LINUX_PWD=your_pwd python hh.py --query_file=query.sql