Уличная нагрузка CSV с запятыми в цитируемых полях
Я пытаюсь загрузить CSV файл в таблицу Hive, например:
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;
Csv разделяется запятой (,) и выглядит следующим образом:
1, "some text, with comma in it", 123, "more text"
Это приведет к возврату поврежденных данных, поскольку в первой строке есть символ ",".
Есть ли способ установить разделитель текста или заставить Hive игнорировать "," в строках?
Я не могу изменить разделитель csv, поскольку он извлекается из внешнего источника.
Ответы
Ответ 1
Проблема заключается в том, что Hive
не обрабатывает цитируемые тексты. Вам либо необходимо предварительно обработать данные, изменив разделитель между полями (например: с помощью задания Hadoop-streaming), либо вы также можете попробовать использовать CSV SerDe, который использует OpenCSV для анализа файлов.
Ответ 2
Если вы можете повторно создать или проанализировать свои входные данные, вы можете указать escape-символ для CREATE TABLE:
ROW FORMAT DELIMITED FIELDS TERMINATED BY "," ESCAPED BY '\\';
Будет принимать эту строку как 4 поля
1,some text\, with comma in it,123,more text
Ответ 3
Как и в Hive 0.14, CSV SerDe является стандартной частью установки Hive
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde'
(Смотрите: https://cwiki.apache.org/confluence/display/Hive/CSV+Serde)
Ответ 4
сохранить разделитель в одинарных кавычках, он будет работать.
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\n';
Это будет работать
Ответ 5
Добавьте обратную косую черту в FIELDS TERMINATED BY '\;'
Пример:
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;
Я протестировал его, и он сработал.
Ответ 6
ORG.APACHE.HADOOP.HIVE.SERDE2.OPENCSVSERDE Serde работал для меня. Мой разделитель был '|' и один из столбцов заключен в двойные кавычки.
Запрос:
CREATE EXTERNAL TABLE EMAIL(MESSAGE_ID STRING, TEXT STRING, TO_ADDRS STRING, FROM_ADDRS STRING, SUBJECT STRING, DATE STRING)
ROW FORMAT SERDE 'ORG.APACHE.HADOOP.HIVE.SERDE2.OPENCSVSERDE'
WITH SERDEPROPERTIES (
"SEPARATORCHAR" = "|",
"QUOTECHAR" = "\"",
"ESCAPECHAR" = "\""
)
STORED AS TEXTFILE location '/user/abc/csv_folder';