我正在尝试使用存储在 S3 上的引用 CSV 文件在 Athena 中创建一个外部表。问题是,我的 CSV 包含列中的缺失值,这些值应该被读取为 INT。简单的例子:
CSV:
id,height,age,name
1,,26,"Adam"
2,178,28,"Robert"
创建表定义:
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' = ''
在 SERDEPROPERTIES
- 不工作。尝试通过
TBLPROPERTIES ('serialization.null.format'='')
指定相同的内容——还是什么都没有。当您将所有列指定为
STRING
时,它会起作用但这不是我需要的。因此,问题是,是否有无论如何使用正确的列规范读取引用的 CSV(引用很重要,因为我的真实数据要复杂得多)到 Athena?
最佳答案
处理这些数据的快速而肮脏的方式:
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
.稍后我将研究正则表达式。
编辑:
正则表达式如 promise :
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
;
注:
RegexSerDe
TBLPROPERTIES ('skip.header.line.count'='1')
似乎无法正常工作.这可能是由于 Hive version由 Athena 或 SerDe 使用。在您的情况下,您可能只排除 ID IS NULL
的行.延伸阅读:
Stackoverflow - remove surrounding quotes from fields while loading data into hive
Athena - OpenCSVSerDe for Processing CSV
关于amazon-athena - 如何将带有 NULL 值的引用 CSV 读入 Amazon Athena,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50723963/