amazon-web-services - AWS 雅典娜 : "HIVE_BAD_DATA: Error parsing column ' X' : empty String"

标签 amazon-web-services hive amazon-athena

我想使用 OpenCSVSerde 基于 CSV 文件在 AWS Athena 上创建一个外部表。

CREATE EXTERNAL TABLE `table`(name string, value double, group string)
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde' 
WITH SERDEPROPERTIES ("separatorChar" = ",", "escapeChar" = "\\","skip.header.line.count"="1",  "serialization.null.format"="") 
LOCATION 's3://path' ; 

该文件包含“值”字段( double 类型)的一些缺失值。它看起来像这样:

name,value,group    
name1,0.5,a
name2,0.2,a
name3,,a
name4,0.11,b

创建它之后,当我尝试运行一些查询(比如简单的“select * from table”)时,Athena 给出了这个错误:

HIVE_BAD_DATA: Error parsing column '1': empty String

正如您从创建外部表查询中看到的那样,我尝试添加 'serialization.null.format'='' 但它似乎不起作用。我找到的唯一解决方案是将“值”列定义为字符串,但这显然不是理想的解决方案(尤其是当您有很多这样的列时)。

你知道如何解决这个问题吗?

谢谢

最佳答案

正如 Vamsi Prabhala 提到的 OpenCSVSerde 根本不支持这个,来自 documentation :

The parser does not recognize empty or null values in columns defined as a numeric data type, leaving them as the default data type of STRING. The workaround is to declare the column as STRING and then CAST it in a SELECT query or view.

因此,如果您确实想坚持使用 OpenCSVSerde,请像您一样创建表("serialization.null.format"="" 不起作用):

CREATE EXTERNAL TABLE `table`(
    name string,
    value double,
    group string)
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde' 
WITH SERDEPROPERTIES (
    "separatorChar" = ",",
    "escapeChar" = "\\",
    "skip.header.line.count"="1") 
LOCATION 's3://path'; 

然后创建一个 View :

CREATE VIEW "typed_table" AS
SELECT
"name",
CAST(
    "value" CASE
        "value"
        WHEN '' THEN NULL
        ELSE "value"
    END AS DOUBLE
),
"group"
FROM "table";

关于amazon-web-services - AWS 雅典娜 : "HIVE_BAD_DATA: Error parsing column ' X' : empty String",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61910540/

相关文章:

amazon-web-services - 使用IAM限制对特定Cloudfront发行版的访问

amazon-web-services - AWS 实例停止然后重新启动后会发生什么变化

pyspark - 减少 Parquet 文件数量的最佳方法

c# - 使用 AWSSDK.S3 通过 C# 验证 Amazon S3 存储桶

javascript - 使用 AWS-SDK-JS 访问 AWS ELB 服务时配置 CORS

hadoop - 如何在 Hive 中将字符串转换为以毫秒为单位的时间戳

hadoop - 加入两个表并在配置单元的新表中插入值

hadoop - 分区 hive 数据复杂数据类型,同时插入数据它显示错误

amazon-athena - 更改 AWS Athena 查询的输出 CSV 文件名

sql - AWS Athena 从选择查询创建表