Как обрабатывать поля, заключенные в кавычки (CSV) при импорте данных из S3 в DynamoDB с использованием EMR / Hive

17

Я пытаюсь использовать 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

    
задан RandomQuestion 27.12.2012 в 22:23
источник

7 ответов

3

Если вы застряли в формате 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';
    
ответ дан libjack 29.12.2012 в 01:11
источник
20

Я также придерживался той же проблемы, что и мои поля, заключенные в двойные кавычки и разделенные точкой с запятой (;). Имя моей таблицы - employee1.

Итак, я искал ссылки, и я нашел идеальное решение для этого.

Для этого мы должны использовать serde. Загрузите serde 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;

Теперь вы увидите волшебство. Спасибо.

    
ответ дан Cast_A_Way 05.03.2014 в 07:29
источник
10

Следующий код решает тот же тип проблемы

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");
    
ответ дан Shankar 17.04.2016 в 14:59
источник
3

В настоящее время куст включает в себя OpenCSVSerde , который будет правильно анализировать эти цитированные поля без добавления дополнительных банок или подверженных ошибкам и медленного регулярного выражения.

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

ответ дан Ben Doerr 14.04.2016 в 05:56
источник
2

Hive не поддерживает цитируемые строки прямо из коробки. Существует два подхода к решению этого вопроса:

  1. Используйте другой разделитель полей (например, канал).
  2. Напишите пользовательский InputFormat на основе OpenCSV.

Более быстрый (и, возможно, более здравый) подход заключается в том, чтобы изменить исходный процесс экспорта, чтобы использовать другой разделитель, чтобы избежать цитирования строк. Таким образом, вы можете сказать, что Hive использует внешнюю таблицу с разделителем вкладок или труб:

CREATE TABLE foo (
  col1 INT,
  col2 STRING
) ROW FORMAT DELIMITED FIELDS TERMINATED BY '|';
    
ответ дан Jeremiah Peschka 28.12.2012 в 15:59
источник
1

Используйте файл csv-serde-0.9.1.jar в вашем кучном запросе, см. Ссылка

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';
    
ответ дан Amit 24.02.2016 в 10:44
источник
0

В этой проблеме может быть несколько решений.

  1. Создать пользовательский класс SerDe
  2. Использовать RegexSerde
  3. Удалить экранированные разделительные символы из данных

Подробнее на ссылке

    
ответ дан minhas23 18.06.2014 в 14:10
источник