为什么在 Amazon Athena 中查询 CSV 数据时,我会收到错误消息“HIVE_BAD_DATA: Error parsing field value '' for field X: For input string: ""”?
上次更新时间:2021 年 9 月 28 日
当我在 Amazon Athena 中查询 CSV 数据时,收到了与以下类似的错误消息:
您的查询存在以下错误:
HIVE_BAD_DATA: Error parsing field value '' for field 0: For input string: ""(HIVE 数据错误:解析字段 0 的字段值 '' 时出错:输入字符串:"")
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.(除非由查询限定,否则此查询将针对“默认”数据库运行。请在我们的论坛上发布此错误消息,或联系客户支持并提供查询 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