wir möchten die Ergebnisse einer Hive-Abfrage in eine CSV-Datei schreiben. Ich dachte, der Befehl sollte so aussehen:
insert overwrite directory '/home/output.csv' select books from table;
Wenn ich es ausführe, wird es erfolgreich abgeschlossen, aber ich kann die Datei niemals finden. Wie finde ich diese Datei oder sollte ich die Daten auf andere Weise extrahieren?
Vielen Dank!
Obwohl es möglich ist, INSERT OVERWRITE
zu verwenden, um Daten aus Hive zu holen, ist dies möglicherweise nicht die beste Methode für Ihren speziellen Fall. Lassen Sie mich zunächst erklären, was INSERT OVERWRITE
tut, dann werde ich die Methode beschreiben, die ich verwende, um TSV-Dateien aus Hive-Tabellen zu erhalten.
Gemäß dem Handbuch speichert Ihre Abfrage die Daten in einem Verzeichnis in HDFS. Das Format wird nicht csv sein.
In das Dateisystem geschriebene Daten werden als Text serialisiert, wobei die Spalten durch ^ A und die Zeilen durch Zeilenumbrüche getrennt sind. Wenn eine der Spalten nicht vom primitiven Typ ist, werden diese Spalten in das JSON-Format serialisiert.
Bei einer geringfügigen Änderung (Hinzufügen des Schlüsselworts LOCAL
) werden die Daten in einem lokalen Verzeichnis gespeichert.
INSERT OVERWRITE LOCAL DIRECTORY '/home/lvermeer/temp' select books from table;
Wenn ich eine ähnliche Abfrage starte, sieht die Ausgabe wie folgt aus.
[[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
Ich persönlich führe meine Abfrage normalerweise direkt über Hive in der Befehlszeile für diese Art von Dingen aus und leite sie wie folgt in die lokale Datei:
Hive -e 'select books from table' > /home/lvermeer/temp.tsv
Das gibt mir eine durch Tabulatoren getrennte Datei, die ich verwenden kann. Ich hoffe, das ist auch für Sie nützlich.
Basierend auf diesem Patch-3682 gehe ich davon aus, dass mit Hive 0.11 eine bessere Lösung zur Verfügung steht, die ich aber nicht selbst testen kann. Die neue Syntax sollte Folgendes zulassen.
INSERT OVERWRITE LOCAL DIRECTORY '/home/lvermeer/temp'
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
select books from table;
Hoffentlich hilft das.
Wenn Sie eine CSV-Datei wünschen, können Sie die Lösungen von Lukas wie folgt ändern (vorausgesetzt, Sie befinden sich in einer Linux-Box):
Hive -e 'select books from table' | sed 's/[[:space:]]\+/,/g' > /home/lvermeer/temp.csv
Sie sollten die Anweisung CREATE TABLE AS SELECT (CTAS) verwenden, um in HDFS ein Verzeichnis mit den Dateien zu erstellen, die die Ergebnisse der Abfrage enthalten. Danach müssen Sie diese Dateien von HDFS auf Ihre reguläre Festplatte exportieren und in einer einzigen Datei zusammenführen.
Möglicherweise müssen Sie einige Tricks ausführen, um die Dateien von '\ 001' - getrennt nach CSV - zu konvertieren. Sie können eine benutzerdefinierte CSV-SerDe verwenden oder die extrahierte Datei nachbearbeiten.
Wenn Sie HUE verwenden, ist dies ebenfalls ziemlich einfach. Gehen Sie einfach zum Hive-Editor in HUE, führen Sie die Hive-Abfrage aus, und speichern Sie die Ergebnisdatei lokal als XLS oder CSV. Alternativ können Sie die Ergebnisdatei in HDFS speichern.
Sie können die Hive-String-Funktion CONCAT_WS( string delimiter, string str1, string str2...strn )
verwenden.
zum Beispiel:
Hive -e 'select CONCAT_WS(',',cola,colb,colc...,coln) from Mytable' > /home/user/Mycsv.csv
Ich suchte nach einer ähnlichen Lösung, aber die hier genannten würden nicht funktionieren. Meine Daten hatten alle Variationen von Leerzeichen (Leerzeichen, Zeilenumbrüche, Tabulatoren) und Kommas.
Um die Spalte data tsv sicherer zu machen, habe ich alle\t-Zeichen in den Spaltendaten durch ein Leerzeichen ersetzt und in der Befehlszeile Python-Code ausgeführt, um eine CSV-Datei zu generieren (siehe unten):
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)")'
Dadurch wurde eine vollständig gültige CSV erstellt. Hoffe, das hilft denen, die nach dieser Lösung suchen.
Ich hatte ein ähnliches Problem und konnte es so angehen.
Schritt 1 - Lädt die Daten aus der Hive-Tabelle wie folgt in eine andere Tabelle
DROP TABLE IF EXISTS TestHiveTableCSV;
CREATE TABLE TestHiveTableCSV
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\n' AS
SELECT Column List FROM TestHiveTable;
Schritt 2 - Kopierte den Blob aus dem Hive-Lager an den neuen Standort mit der entsprechenden Erweiterung
Start-AzureStorageBlobCopy
-DestContext $destContext
-SrcContainer "Source Container"
-SrcBlob "Hive/warehouse/TestHiveTableCSV/000000_0"
-DestContainer "Destination Container"
-DestBlob "CSV/TestHiveTable.csv"
Sie können INSERT
… DIRECTORY
… wie in diesem Beispiel verwenden:
INSERT OVERWRITE LOCAL DIRECTORY '/tmp/ca_employees'
SELECT name, salary, address
FROM employees
WHERE se.state = 'CA';
OVERWRITE
und LOCAL
haben die gleichen Interpretationen wie zuvor und Pfade werden nach den üblichen Regeln interpretiert. Abhängig von der Anzahl der aufgerufenen Reduzierstücke werden eine oder mehrere Dateien in /tmp/ca_employees
geschrieben.
Das Standardtrennzeichen ist "^A
". In der Python-Sprache ist dies "\x01
".
Wenn ich das Trennzeichen ändern möchte, verwende ich SQL wie folgt:
SELECT col1, delimiter, col2, delimiter, col3, ..., FROM table
Betrachten Sie dann Trennzeichen + "^A
" als neues Trennzeichen.
Ich komme vielleicht zu spät, würde aber bei der Antwort helfen:
echo "COL_NAME1 | COL_NAME2 | COL_NAME3 | COL_NAME4"> SAMPLE_Data.csv Hive -e 'wähle unterschiedliches concat (COL_1, "|", COL_2, "|", COL_3, "|", COL_4) aus table_Name where-Klausel falls erforderlich;' >> SAMPLE_Data.csv
Ich habe verschiedene Optionen ausprobiert, aber dies wäre eine der einfachsten Lösungen für Python
Pandas
:
Hive -e 'select books from table' | grep "|" ' > temp.csv
df=pd.read_csv("temp.csv",sep='|')
Sie können auch tr "|" ","
verwenden, um "|" zu konvertieren. zu ","
Dieser Shell-Befehl druckt das Ausgabeformat in csv in output.txt
ohne die Spaltenüberschriften.
$ Hive --outputformat=csv2 -f 'hivedatascript.hql' --hiveconf Hive.cli.print.header=false > output.txt
Hive --outputformat=csv2 -e "select * from yourtable" > my_file.csv
oder
Hive --outputformat=csv2 -e "select * from yourtable" > [your_path]/file_name.csv
Ändern Sie für tsv in den obigen Abfragen einfach csv in tsv und führen Sie Ihre Abfragen aus
Wenn Sie dies von Windows aus tun, können Sie das Python-Skript hivehoney verwenden, um Tabellendaten in die lokale CSV-Datei zu extrahieren.
Es wird:
Führen Sie es so aus:
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
Um die folgenden Schritte nach dem Start der Abfrage zu erläutern: INSERT OVERWRITE LOCAL DIRECTORY '/home/lvermeer/temp' ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' select books from table;
In meinem Fall haben die generierten Daten im temporären Ordner das Format deflate
und sehen folgendermaßen aus:
$ ls
000000_0.deflate
000001_0.deflate
000002_0.deflate
000003_0.deflate
000004_0.deflate
000005_0.deflate
000006_0.deflate
000007_0.deflate
Hier ist der Befehl, um die deflate-Dateien zu entpacken und alles in eine csv-Datei zu packen:
hadoop fs -text "file:///home/lvermeer/temp/*" > /home/lvermeer/result.csv
Ähnlich wie Rays Antwort oben, können Sie mit Hive View 2.0 in Hortonworks Data Platform auch eine Hive-Abfrage ausführen und die Ausgabe als csv speichern.
Dies ist die csv-freundlichste Methode, mit der ich die Ergebnisse von HiveQL ausgegeben habe.
Sie benötigen keine grep- oder sed-Befehle, um die Daten zu formatieren. Stattdessen unterstützt Hive diese Befehle. Sie müssen lediglich einen zusätzlichen Tag für das Ausgabeformat hinzufügen.
Hive --outputformat=csv2 -e 'select * from <table_name> limit 20' > /path/toStore/data/results.csv