如何将带有NULL值的带引号的CSV读入Amazon Athena

Mik*_*laj 10 amazon-athena

我正在尝试使用存储在S3上的引用CSV文件在Athena中创建外部表.问题是,我的CSV包含应该作为INT读取的列中的缺失值.简单的例子:

CSV:

id,height,age,name
1,,26,"Adam"
2,178,28,"Robert"
Run Code Online (Sandbox Code Playgroud)

创建表定义:

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/'
Run Code Online (Sandbox Code Playgroud)

CREATE TABLE语句运行正常,但一旦我尝试查询表,我就得到了HIVE_BAD_DATA: Error parsing field value ''.

我试着让CSV看起来像这样(引用空字符串):

"id","height","age","name"
1,"",26,"Adam"
2,178,28,"Robert"
Run Code Online (Sandbox Code Playgroud)

但它不起作用.

试图指定'serialization.null.format' = ''SERDEPROPERTIES-不工作.

尝试指定相同的通过TBLPROPERTIES ('serialization.null.format'='')- 仍然没有.

当你指定所有列时,它可以工作,STRING但这不是我需要的.

因此,问题是,是否有任何方法可以使用正确的列规范读取带引号的CSV(引用对于我的真实数据更为复杂,因为我的实际数据要复杂得多)?

Zer*_*odf 5

处理这些数据的快捷方式:

CSV:

id,height,age,name
1,,26,"Adam"
2,178,28,"Robert"
3,123,34,"Bill, Comma"
4,183,38,"Alex"
Run Code Online (Sandbox Code Playgroud)

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')
;
Run Code Online (Sandbox Code Playgroud)

问题是它不处理最后一个字段中的引号字符。根据AWS提供的文档,这对于Hive中的LazySimpleSerDe是有意义的。

我怀疑解决方案正在使用以下SerDe org.apache.hadoop.hive.serde2.RegexSerDe

我将在稍后处理正则表达式。

编辑:

正则表达式承诺:

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
;
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

注意:RegexSerDe似乎无法与一起正常使用TBLPROPERTIES ('skip.header.line.count'='1')。那可能是由于雅典娜或SerDe使用的Hive版本。就您而言,您可能只排除其中的行ID IS NULL

进一步阅读:

Stackoverflow-在将数据加载到配置单元中的同时删除字段周围的引号

雅典娜-用于处理CSV的OpenCSVSerDe