2012-11-29 20 views
30

Sto cercando di caricare un file CSV in una tabella Hive in questo modo:Hive carico CSV con le virgole nei campi citati

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;  


Il csv è delimitato da una virgola (,) e si presenta così:

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

Ciò restituirà dati corrotti poiché nella prima stringa è presente un ','.
C'è un modo per impostare un delimitatore di testo o rendere Hive ignorare il ',' nelle stringhe?

Non posso cambiare il delimitatore del csv dal momento che viene tirato da una fonte esterna.

risposta

24

Il problema è che Hive non gestisce testi citati. È necessario pre-elaborare i dati modificando il delimitatore tra i campi (ad es. Con un lavoro di streaming Hadoop) oppure è possibile provare a utilizzare un numero personalizzato CSV SerDe che utilizza OpenCSV per analizzare i file.

+0

Grazie, ha fatto il trucco! –

+0

sed -i '/ "// g' nome_file tuo fa il pre-processo sul posto rimuovendo il testo citato.Tuttavia, è necessario essere certi che non ci sia una rimozione innocua di altri caratteri quotati ("). – ekta

25

Se si riesce a ricreare o analizzare i dati di input, è possibile specificare un carattere di escape per il CREATE TABLE:

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

accetterà questa linea come 4 campi

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

Questo gestisce le virgole incorporate, ma non le nuove linee incorporate, che sono l'altro trucchetto nei dati CSV. Oppure possono essere scappati anche i newline? Le specifiche su https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL#LanguageManualDDL-CreateTable non sembrano consentire l'escaping di una nuova riga. –

14

partire dal Hive 0.14, il CSV SerDe è una parte standard del Hive installare

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

(Vedere: https://cwiki.apache.org/confluence/display/Hive/CSV+Serde)

+0

Se il tuo HIVE è aggiornato, questa è la migliore risposta :) – bartektartanus

+0

Anche questo mi ha aiutato! – Kulasangar

+1

Quando si utilizza OpenCSVSerde esiste un modo per specificare con cosa viene definito Null? Usando "ROW FORMAT DELIMITED" potrei aggiungere l'opzione "NULL DEFINED AS" '"per riconoscere valori nulli nei dati. – JeffR

0

mantenere il delimitatore tra virgolette singole funzionerà.

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

Ciò funzionerà

0

aggiungere una barra a ritroso nei campi denuncia da parte di '\;'

Per esempio:

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; 

ho provato, e ha funzionato.