Как читать цитируемые CSV со значениями NULL в Amazon Athena - PullRequest
0 голосов
/ 06 июня 2018

Я пытаюсь создать внешнюю таблицу в Афине, используя цитированный CSV-файл, хранящийся на S3.Проблема в том, что мой CSV содержит пропущенные значения в столбцах, которые должны читаться как INT.Простой пример:

CSV:

id,height,age,name
1,,26,"Adam"
2,178,28,"Robert"

CREATE TABLE DEFINITION:

CREATE EXTERNAL TABLE schema.test_null_unquoted (
  id INT,
  height INT,
  age INT,
  name STRING
)
ROW FORMAT 
SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde'
WITH SERDEPROPERTIES (
'separatorChar' = ",",
'quoteChar' = '"',
'skip.header.line.count' = '1'
)
STORED AS TEXTFILE
LOCATION 's3://mybucket/test_null/unquoted/'

CREATE TABLE оператор выполняется нормально, но как только я пытаюсь запросить таблицу,Я получаю HIVE_BAD_DATA: Error parsing field value ''.

Я пытался сделать CSV похожим на это (цитата пустая строка):

"id","height","age","name"
1,"",26,"Adam"
2,178,28,"Robert"

Но это не работает.

Пробовал указывать'serialization.null.format' = '' in SERDEPROPERTIES - не работает.

Попытка указать то же самое с помощью TBLPROPERTIES ('serialization.null.format'='') - по-прежнему ничего.

Работает, когда вы указываете все столбцы как STRING, но это не такчто мне нужно.

Следовательно, вопрос в том, есть ли любой способ прочитать цитируемое CSV (цитирование важно, поскольку мои реальные данные намного сложнее) в Афину с правильной спецификацией столбца

1 Ответ

0 голосов
/ 07 июня 2018

Быстрый и грязный способ обработки этих данных:

CSV:

id,height,age,name
1,,26,"Adam"
2,178,28,"Robert"
3,123,34,"Bill, Comma"
4,183,38,"Alex"

DDL:

CREATE EXTERNAL TABLE stackoverflow.test_null_unquoted (
  id INT,
  height INT,
  age INT,
  name STRING
)
ROW FORMAT DELIMITED
 FIELDS TERMINATED BY ','
 LINES TERMINATED BY '\n' -- Or use Windows Line Endings
LOCATION 's3://XXXXXXXXXXXXX/'
TBLPROPERTIES ('skip.header.line.count'='1')
;

Проблема в том, что он не обрабатывает цитатусимволы в последнем поле.Исходя из документации, предоставленной AWS , это имеет смысл, поскольку LazySimpleSerDe дает следующее из Hive .

Я подозреваю, что решение использует следующий SerDe org.apache.hadoop.hive.serde2.RegexSerDe.

Я буду работать над регулярным выражением позже.

Редактировать:

Regex как и было обещано:

CREATE EXTERNAL TABLE stackoverflow.test_null_unquoted (
  id INT,
  height INT,
  age INT,
  name STRING
)
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe'
WITH SERDEPROPERTIES (
"input.regex" = "(.*),(.*),(.*),\"(.*)\""
)
LOCATION 's3://XXXXXXXXXXXXXXX/'
TBLPROPERTIES ('skip.header.line.count'='1') -- Does not appear to work
;

enter image description here

Примечание: RegexSerDe не работает должным образом с TBLPROPERTIES ('skip.header.line.count'='1').Это может быть связано с версией Hive , используемой Athena или SerDe.В вашем случае вы, скорее всего, можете просто исключить строки, где ID IS NULL.

Дополнительная литература:

Stackoverflow - удаляйте окружающие кавычки из полей при загрузке данных в улей

Афина -OpenCSVSerDe для обработки CSV

...