wake-up-neo.com

Wie gebe ich die Ergebnisse einer HiveQL-Abfrage an CSV aus?

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!

71
AAA

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.

138
Lukas Vermeer

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
21

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.

4
Olaf

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.

3
Ray

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
3
Ram Ghadiyaram

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.

3
sisanared

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"
2

Sie können INSERTDIRECTORY… 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.

2
bigmakers

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.

1
moshaholo

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

0
Anil Kumar K B

Ich habe verschiedene Optionen ausprobiert, aber dies wäre eine der einfachsten Lösungen für PythonPandas:

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 ","

0
notilas

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

0
Terminator17

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:

  1. Melden Sie sich bei Bastion Host an. 
  2. pbrun 
  3. kinit. 
  4. beeline (mit Ihrer Anfrage). 
  5. Speichern Sie das Echo von beeline in eine Datei unter Windows.

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
0
Alex B

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
0
JohnnyHuo

Ä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.

0
schoon

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
0