Hive ładuje plik CSV z przecinkami w cytowanych polach

Próbuję załadować plik CSV do tabeli Hive TAK:

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;    


Plik csv jest oddzielony przecinkiem (,) i wygląda następująco:

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

Zwróci uszkodzone dane, ponieważ w pierwszym łańcuchu jest','.
Czy istnieje sposób na ustawienie ogranicznika tekstu lub aby Hive ignorował', ' w łańcuchach?

Nie mogę zmienić ogranicznika pliku csv, ponieważ pobiera się go z zewnętrznego źródła.

Author: wrschneider, 2012-11-29

5 answers

Problem polega na tym, że Hive nie obsługuje cytowanych tekstów. Albo musisz wstępnie przetworzyć dane, zmieniając ogranicznik między polami (np.: z zadaniem strumieniowania Hadoop), albo możesz spróbować użyć niestandardowego serwera CSV, który używa OpenCSV do parsowania plików.

 26
Author: Lorand Bendig,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-11-29 16:52:44

Jeśli możesz ponownie utworzyć lub przetworzyć dane wejściowe, możesz określić znak specjalny dla tabeli CREATE:

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

Przyjmie tę linię jako 4 pola

1,some text\, with comma in it,123,more text
 28
Author: libjack,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-11-30 13:59:11

W przeciwieństwie do wersji 1.1, CSV SerDe jest standardową częścią instalacji Hive.]}

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

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

 18
Author: wrschneider,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-11 03:16:21

Zachowaj ogranicznik w pojedynczych cudzysłowach, to będzie działać.

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

To zadziała

 0
Author: suyash,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-09 19:23:11

Dodaj ukośnik wsteczny w polach zakończonych'\; '

Na Przykład:

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;
Przetestowałem to i zadziałało.
 0
Author: Mantej Singh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-14 14:54:07