我想使用 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/