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.