Подтвердить что ты не робот

Как обрабатывать поля, заключенные в кавычки (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

4b9b3361

Ответ 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';