it-swarm.com.de

Laden Sie CSV mit Kommas in zitierten Feldern

Ich versuche, eine CSV-Datei wie folgt in eine Hive-Tabelle zu laden:

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 wird durch ein Komma (,) begrenzt und sieht folgendermaßen aus:

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

Dadurch werden beschädigte Daten zurückgegeben, da die erste Zeichenfolge ein ',' enthält.
Gibt es eine Möglichkeit, einen Textbegrenzer festzulegen oder Hive das ',' in Strings zu ignorieren?

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

40

Das Problem ist, dass Hive keine zitierten Texte verarbeitet. Sie müssen entweder die Daten vorverarbeiten, indem Sie das Trennzeichen zwischen den Feldern ändern (z. B. mit einem Hadoop-Streaming-Job), oder Sie können auch versuchen, ein benutzerdefiniertes CSV SerDe zu verwenden, das die Dateien mit OpenCSV analysiert .

28
Lorand Bendig

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

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

Akzeptiert diese Zeile als 4 Felder

1,some text\, with comma in it,123,more text
29
libjack

Ab Hive 0.14 ist der CSV SerDe ein Standardbestandteil der Hive-Installation

ROW FORMAT SERDE 'org.Apache.hadoop.Hive.serde2.OpenCSVSerde'

(Siehe: https://cwiki.Apache.org/confluence/display/Hive/CSV+Serde )

20
wrschneider

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

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

Das wird funktionieren

0
suyash

Fügen Sie in FIELDS TERMINATED BY '\;' einen umgekehrten Schrägstrich ein.

Zum 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 habe es getestet und es hat funktioniert.

0
Mantej Singh