当我在 Athena 中查询 CSV 数据时,遇到了错误“HIVE_BAD_DATA: Error parsing field value '' for field X: For input string: ""”

上次更新时间:2020 年 3 月 30 日

当我在 Amazon Athena 中查询 CSV 数据,遇到了如下错误:

Your query has the following error(s):
HIVE_BAD_DATA: Error parsing field value '' for field 0: For input string: ""
This query ran against the "default" database, unless qualified by the query. Please post the error message on our forum or contact customer support with Query Id: b99xxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx.

简短描述

此错误有多个版本。如果错误消息包含一个带有值的输入字符串值(例如,“For input string: "12312845691"”),则表示文件中的数据类型与架构中的预期数据类型不匹配。有关更多信息,请参阅我的 Amazon Athena 查询失败,并显示错误“HIVE_BAD_DATA: Error parsing field value for field X: For input string: "12312845691"”

当以下两个条件都为 true 时,将发生指明输入字符串为 null 或空的错误(“For input string: "”):

  • 您将 Athena 与 OpenCSVSerDe 一起使用,这意味着您的源数据使用双引号 (") 作为默认引号字符。
  • 源数据包含 null 值 ("") 或空单元格。

例如,以下数据将返回“Error parsing field value”错误:

"1","1","a3","a4"
"","2","a3","def"
"1","3","abc3","ab4"

解决方法

将每个列都定义为 STRING。Athena 中的解析器会根据发现的内容将 STRING 中的值解析为实际类型。这可以防止 Athena 在找到 null 值(带双引号且无空格的空字符串)或空单元格(没有值或双引号)时引发错误。有关 Athena 如何处理 CSV 文件的更多信息,请参阅 用于处理 CSV 的 OpenCSVSerDe

要对具有 null 值或空值的列使用特定的数据类型,请使用 CAST 将列转换为所需的类型:

1.    创建表并将每个列定义为 STRING:

CREATE EXTERNAL TABLE myopencsvtable_example (
   col1 string,
   col2 string,
   col3 string,
   col4 string
)
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde'
WITH SERDEPROPERTIES (
   'separatorChar' = ',',
   'quoteChar' = '"',
   'escapeChar' = '\\'
   )
STORED AS TEXTFILE
LOCATION 's3://awsexamplebucket/';

2.    查询表:

select * from myopencsvtable_example

示例输出:

     col1     col2    col3      col4
1    1        1       a3        a4
2             2       a3        def
3    1        3       abc3      ab4

3.    将“col1”强制转换为 INT 并打印 null 值的默认值 (""):

SELECT COALESCE(TRY(CAST(col1 AS integer)),0) as cast_column,* from myopencsvtable_example

示例输出:

     cast_column    col1    col2     col3      col4
1    1              1       1        a3        a4
2    0                      2        a3        def
3    1              1       3        abc3      ab4 

这篇文章对您有帮助吗?

我们可以改进什么?


需要更多帮助?