Obwohl es möglich ist INSERT OVERWRITE
, Daten aus Hive abzurufen, ist dies möglicherweise nicht die beste Methode für Ihren speziellen Fall. Lassen Sie mich zuerst erklären, was INSERT OVERWRITE
funktioniert, und dann die Methode beschreiben, mit der ich tsv-Dateien aus Hive-Tabellen abrufe.
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 mit durch ^ A getrennten Spalten und durch Zeilenumbrüche getrennten Zeilen serialisiert. Wenn eine der Spalten nicht vom primitiven Typ ist, werden diese Spalten in das JSON-Format serialisiert.
Durch eine geringfügige Änderung (Hinzufügen des LOCAL
Schlüsselworts) werden die Daten in einem lokalen Verzeichnis gespeichert.
INSERT OVERWRITE LOCAL DIRECTORY '/home/lvermeer/temp' select books from table;
Wenn ich eine ähnliche Abfrage ausführe, sieht die Ausgabe folgendermaßen aus.
[lvermeer@hadoop temp]$ ll
total 4
-rwxr-xr-x 1 lvermeer users 811 Aug 9 09:21 000000_0
[lvermeer@hadoop temp]$ head 000000_0
"row1""col1"1234"col3"1234FALSE
"row2""col1"5678"col3"5678TRUE
Persönlich führe ich 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. Hoffe das ist auch für dich nützlich.
Basierend auf diesem Patch-3682 vermute ich, dass bei Verwendung von Hive 0.11 eine bessere Lösung verfügbar ist, kann dies jedoch nicht selbst testen. Die neue Syntax sollte Folgendes ermöglichen.
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 möchten, können Sie die Lösungen von Lukas wie folgt ändern (vorausgesetzt, Sie befinden sich auf einer Linux-Box):
quelle
Sie sollten die Anweisung CREATE TABLE AS SELECT (CTAS) verwenden, um ein Verzeichnis in HDFS mit den Dateien zu erstellen, die die Ergebnisse der Abfrage enthalten. Danach müssen Sie diese Dateien von HDFS auf Ihre normale Festplatte exportieren und zu einer einzigen Datei zusammenführen.
Möglicherweise müssen Sie auch einige Tricks ausführen, um die Dateien von '\ 001' - getrennt in CSV - zu konvertieren. Sie können eine benutzerdefinierte CSV-SerDe verwenden oder die extrahierte Datei nachbearbeiten.
quelle
Sie können verwenden
INSERT
...DIRECTORY
..., wie in diesem Beispiel:OVERWRITE
undLOCAL
haben die gleichen Interpretationen wie zuvor und Pfade werden nach den üblichen Regeln interpretiert./tmp/ca_employees
Abhängig von der Anzahl der aufgerufenen Reduzierer werden eine oder mehrere Dateien beschrieben .quelle
Wenn Sie HUE verwenden, ist dies ebenfalls ziemlich einfach. Gehen Sie einfach zum Hive-Editor in HUE, führen Sie Ihre Hive-Abfrage aus und speichern Sie die Ergebnisdatei lokal als XLS oder CSV, oder Sie können die Ergebnisdatei in HDFS speichern.
quelle
Ich suchte nach einer ähnlichen Lösung, aber die hier genannten würden nicht funktionieren. Meine Daten enthielten alle Variationen von Leerzeichen (Leerzeichen, Zeilenumbrüche, Tabulatoren) und Kommas.
Um die Sicherheit der Spaltendaten tsv zu gewährleisten, habe ich alle \ t Zeichen in den Spaltendaten durch ein Leerzeichen ersetzt und Python-Code in der Befehlszeile ausgeführt, um eine CSV-Datei zu generieren, wie unten gezeigt:
Dies schuf eine vollkommen gültige CSV. Hoffe, das hilft denen, die nach dieser Lösung suchen.
quelle
Sie können die Hive-String-Funktion verwenden
CONCAT_WS( string delimiter, string str1, string str2...strn )
zum Beispiel:
quelle
Ich hatte ein ähnliches Problem und so konnte ich es angehen.
Schritt 1 - Laden Sie die Daten aus der Hive-Tabelle wie folgt in eine andere Tabelle
Schritt 2 - Kopieren Sie den Blob aus dem Hive-Lager an den neuen Speicherort mit der entsprechenden Erweiterung
quelle
oder
Ändern Sie für tsv in den obigen Abfragen einfach csv in tsv und führen Sie Ihre Abfragen aus
quelle
Dies ist die csv-freundlichste Methode, mit der ich die Ergebnisse von HiveQL ausgeben konnte.
Sie benötigen keine grep- oder sed-Befehle, um die Daten zu formatieren. Stattdessen unterstützt hive dies. Sie müssen lediglich ein zusätzliches Tag für das Ausgabeformat hinzufügen.
quelle
Das Standardtrennzeichen ist "
^A
". In der Python-Sprache ist es "\x01
".Wenn ich das Trennzeichen ändern möchte, verwende ich SQL wie folgt:
Betrachten Sie dann das Trennzeichen + "
^A
" als neues Trennzeichen.quelle
Ich habe verschiedene Optionen ausprobiert, aber dies wäre eine der einfachsten Lösungen für
Python
Pandas
:Sie können auch
tr "|" ","
"|" konvertieren zu ","quelle
Ähnlich wie in Rays Antwort oben können Sie mit Hive View 2.0 in Hortonworks Data Platform auch eine Hive-Abfrage ausführen und die Ausgabe dann als CSV speichern.
quelle
Wenn Sie dies unter Windows 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:
quelle
Nur um weitere folgende Schritte nach dem Starten der Abfrage zu behandeln:
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
deflate
Format und sehen folgendermaßen aus:Hier ist der Befehl, um die Deflate-Dateien zu entpacken und alles in eine CSV-Datei zu packen:
quelle
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ählen Sie eine eindeutige Konkat (COL_1, "|", COL_2, "|", COL_3, "|", COL_4) aus table_Name, wo Klausel, falls erforderlich;' >> SAMPLE_Data.csv
quelle
Dieser Shell-Befehl druckt das Ausgabeformat in CSV
output.txt
ohne die Spaltenüberschriften.quelle
Verwenden Sie den Befehl:
hive -e "benutze [Datenbankname]; wähle * aus [Tabellenname] LIMIT 10;" > /path/to/file/my_file_name.csv
Ich hatte einen riesigen Datensatz, dessen Details ich zu organisieren und die Arten von Angriffen und die Anzahl der einzelnen Typen zu bestimmen versuchte. Ein Beispiel, das ich für meine Praxis verwendet habe, das funktioniert hat (und etwas mehr Details hatte), sieht ungefähr so aus:
quelle