amazon-athena - 如何将带有 NULL 值的引用 CSV 读入 Amazon Athena

标签 amazon-athena

我正在尝试使用存储在 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
;

enter image description here

注: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/

相关文章:

amazon-web-services - 无法使用 create_dynamic_frame.from_catalog 从 AWS 胶水作业访问使用分区投影配置的表中的数据

sql - 如何在 AWS Athena 上生成日期列表

amazon-web-services - 亚马逊雅典娜的分区表

amazon-web-services - 如何读取雅典娜中的转义字符

amazon-web-services - AWS Athena 上的 AccessDenied

sql - 将 CASE WHEN 与多个 When 一起使用只会产生 BOOLEAN 值

amazon-web-services - 如何授予 Athena 对 Lambda 函数的查询权限?

sql - 两个相似的 presto SQL 查询之间的差异

amazon-web-services - 无法使用Golang SDK在AWS athena上执行查询

python - ASW Athena boto3 冰山 table - 插入