2012-11-29 9 views
30

Ich versuche, eine CSV-Datei in eine Hive Tabelle zu laden, wie so:Hive Last CSV mit Komma in Anführungszeichen gesetzten Feldern

CREATE TABLE mytable 
(
num1 INT, 
text1 STRING, 
num2 INT, 
text2 STRING 
) 
ROW FORMAT DELIMITED FIELDS TERMINATED BY ","; 

LOAD DATA LOCAL INPATH '/data.csv' 
OVERWRITE INTO TABLE mytable;  


Die csv durch ein Komma begrenzt wird (,) und sieht wie folgt aus:

1, "some text, with comma in it", 123, "more text" 

Dies wird beschädigte Daten zurückgeben, da in der ersten Zeichenfolge ein ',' vorhanden ist.
Gibt es eine Möglichkeit, einen Textbegrenzer festzulegen oder Hive das ',' in Strings zu ignorieren?

Ich kann das Trennzeichen des CSV nicht ändern, da es von einer externen Quelle gezogen wird.

Antwort

24

Das Problem ist, dass Hive nicht zitiert Texte verarbeitet. Sie müssen die Daten entweder vorab verarbeiten, indem Sie das Trennzeichen zwischen den Feldern ändern (z. B. mit einem Hadoop-Streaming-Job), oder Sie können versuchen, eine benutzerdefinierte CSV SerDe zu verwenden, die OpenCSV zum Parsen der Dateien verwendet.

+0

Danke das hat den Trick gemacht! –

+0

sed -i 's/"// g" Ihr_Dateiname übernimmt die Vorverarbeitung durch Entfernen des zitierten Textes. Sie MÜSSEN jedoch sicher sein, dass keine anderen beabsichtigten (") Zeichen entfernt werden. – ekta

25

Wenn Sie neu erstellen oder Ihre Eingabedaten analysieren, können Sie ein Escape-Zeichen für die CREATE TABLE angeben:

ROW FORMAT DELIMITED FIELDS TERMINATED BY "," ESCAPED BY '\\'; 

Wird diese Zeile als 4 Felder akzeptieren

1,some text\, with comma in it,123,more text 
+2

Das behandelt eingebettete Kommas, aber keine eingebetteten Zeilenumbrüche, die andere in CSV-Daten sind. Oder können die Newlines auch entkommen? Die Spezifikation unter https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL#LanguageManualDDL-CreateTable scheint keine Zeilenumbrüche zuzulassen. –

14

Ab Hive 0,14, ist der CSV SerDe zu einem festen Bestandteil des Hive installieren

ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde'

+0

Wenn dein HIVE auf dem neuesten Stand ist, ist dies die beste Antwort :) – bartektartanus

+0

Das hat mir auch geholfen! – Kulasangar

+1

Wenn Sie OpenCSVSerde verwenden, gibt es eine Möglichkeit anzugeben, wofür Null definiert ist? Mit "ROW FORMAT DELIMITED" konnte ich die Option "NULL DEFINED AS ''" hinzufügen, um Nullwerte in den Daten zu erkennen. – JeffR

0

behalten Sie das Trennzeichen in einfachen Anführungszeichen, es funktioniert.

ROW FORMAT DELIMITED 
FIELDS TERMINATED BY ',' 
LINES TERMINATED BY '\n'; 

Dies funktioniert

0

einen umgekehrten Schrägstrich in FIELDS TERMINATED BY Add '\;'

Beispiel:

CREATE TABLE demo_table_1_csv 
COMMENT 'my_csv_table 1' 
ROW FORMAT DELIMITED 
FIELDS TERMINATED BY '\;' 
LINES TERMINATED BY '\n' 
STORED AS TEXTFILE 
LOCATION 'your_hdfs_path' 
AS 
select a.tran_uuid,a.cust_id,a.risk_flag,a.lookback_start_date,a.lookback_end_date,b.scn_name,b.alerted_risk_category, 
CASE WHEN (b.activity_id is not null) THEN 1 ELSE 0 END as Alert_Flag 
FROM scn1_rcc1_agg as a LEFT OUTER JOIN scenario_activity_alert as b ON a.tran_uuid = b.activity_id; 

ich es getestet haben, und es funktionierte.