Как обрабатывать поля, заключенные в кавычки (CSV) при импорте данных из S3 в DynamoDB с использованием EMR/Hive
Я пытаюсь использовать EMR/Hive для импорта данных из S3 в DynamoDB. В моем CSV файле есть поля, которые заключены в двойные кавычки и разделены запятой.
При создании внешней таблицы в кусте я могу указать разделитель как запятую, но как указать, что поля заключены в кавычки?
Если я не укажу, я вижу, что значения в DynamoDB заполняются в двух двойных кавычках "значение" ", которое кажется неправильным.
Я использую следующую команду для создания внешней таблицы. Есть ли способ указать, что поля заключены в двойные кавычки?
CREATE EXTERNAL TABLE emrS3_import_1(col1 string, col2 string, col3 string, col4 string) ROW FORMAT DELIMITED FIELDS TERMINATED BY '","' LOCATION 's3://emrTest/folder';
Любые предложения будут оценены.
благодаря
Jitendra
Ответы
Ответ 1
Если вы застряли в формате CSV файла, вам придется использовать специальный SerDe; и здесь некоторые работают на основе libarary opencsv.
Но если вы можете изменить исходные файлы, вы можете либо выбрать новый разделитель, чтобы поля с кавычками не были нужны (удачи), либо переписывались, чтобы избежать любых встроенных запятых с одним escape-символом, например. '\', который может быть указан в ROW FORMAT с ESCAPED BY:
CREATE EXTERNAL TABLE emrS3_import_1(col1 string, col2 string, col3 string, col4 string) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' ESCAPED BY '\\' LOCATION 's3://emrTest/folder';
Ответ 2
Я также придерживался той же проблемы, что и мои поля, заключенные в двойные кавычки и разделенные точкой с запятой (;). Имя моей таблицы - employee1.
Итак, я искал ссылки, и я нашел идеальное решение для этого.
Для этого мы должны использовать serde. Загрузите serde jar, используя эту ссылку: https://github.com/downloads/IllyaYalovyy/csv-serde/csv-serde-0.9.1.jar
затем следуйте нижеприведенным шагам, используя подсказку с приглашением:
add jar path/to/csv-serde.jar;
create table employee1(id string, name string, addr string)
row format serde 'com.bizo.hive.serde.csv.CSVSerde'
with serdeproperties(
"separatorChar" = "\;",
"quoteChar" = "\"")
stored as textfile
;
а затем загрузите данные из заданного пути, используя следующий запрос:
load data local inpath 'path/xyz.csv' into table employee1;
а затем запустите:
select * from employee1;
Теперь вы увидите волшебство. Спасибо.
Ответ 3
Следующий код решает тот же тип проблемы
CREATE TABLE TableRowCSV2(
CODE STRING,
PRODUCTCODE STRING,
PRICE STRING
)
COMMENT 'row data csv'
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde'
WITH SERDEPROPERTIES (
"separatorChar" = "\,",
"quoteChar" = "\""
)
STORED AS TEXTFILE
tblproperties("skip.header.line.count"="1");
Ответ 4
Теперь улей включает в себя OpenCSVSerde
, который будет правильно анализировать эти цитированные поля без добавления дополнительных банок или подверженных ошибкам и медленного регулярного выражения.
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde'
Ответ 5
Hive не поддерживает цитируемые строки прямо из коробки. Существует два подхода к решению этого вопроса:
- Используйте другой разделитель полей (например, канал).
- Напишите пользовательский InputFormat на основе OpenCSV.
Более быстрый (и, возможно, более здравый) подход заключается в том, чтобы изменить исходный процесс экспорта, чтобы использовать другой разделитель, чтобы избежать цитирования строк. Таким образом, вы можете сказать, что Hive использует внешнюю таблицу с разделителем вкладок или труб:
CREATE TABLE foo (
col1 INT,
col2 STRING
) ROW FORMAT DELIMITED FIELDS TERMINATED BY '|';
Ответ 6
Используйте файл csv-serde-0.9.1.jar
в вашем запросе на улей, см.
http://illyayalovyy.github.io/csv-serde/
add jar /path/to/jar_file
Create external table emrS3_import_1(col1 string, col2 string, col3 string, col4 string) row format serde 'com.bizo.hive.serde.csv.CSVSerde'
with serdeproperties
(
"separatorChar" = "\;",
"quoteChar" = "\"
) stored as textfile
tblproperties("skip.header.line.count"="1") ---to skip if have any header file
LOCATION 's3://emrTest/folder';
Ответ 7
В этой проблеме может быть несколько решений.
- Создать пользовательский класс SerDe
- Использовать RegexSerde
- Удалить экранированные разделительные символы из данных
Подробнее на http://grokbase.com/t/hive/user/117t2c6zhe/urgent-hive-not-respecting-escaped-delimiter-characters