AWS Athena:HIVE_BAD_数据错误:拼花地板中的字段类型DOUBLE与表架构中定义的类型不兼容

AWS Athena:HIVE_BAD_数据错误:拼花地板中的字段类型DOUBLE与表架构中定义的类型不兼容,hive,parquet,amazon-athena,pyarrow,Hive,Parquet,Amazon Athena,Pyarrow,我使用AWS Athena查询存储在S3中的一些数据,即使用pyarrow压缩的分区拼花文件 我有三列字符串值,一列称为“key”,一列称为int值,另一列称为“result”,它们都有双精度值和int值 通过这些列,我创建了如下模式: 创建外部表( 密钥int, 结果加倍, 位置字符串, 车辆名称字符串。 文件名字符串 ) 当我查询表时,我会得到 配置单元错误数据:parquet中的字段结果类型INT64与表架构中定义的类型DOUBLE不兼容 因此,我修改了一个模式,其结果数据类型为INT

我使用AWS Athena查询存储在S3中的一些数据,即使用pyarrow压缩的分区拼花文件

我有三列字符串值,一列称为“key”,一列称为int值,另一列称为“result”,它们都有双精度值和int值

通过这些列,我创建了如下模式:

创建外部表(
密钥int,
结果加倍,
位置字符串,
车辆名称字符串。
文件名字符串
)
当我查询表时,我会得到

配置单元错误数据:parquet中的字段结果类型INT64与表架构中定义的类型DOUBLE不兼容

因此,我修改了一个模式,其结果数据类型为
INT

然后我查询了一下桌子,得到了

配置单元错误数据:parquet中的字段结果类型DOUBLE与表架构中定义的类型INT不兼容

我环顾四周试图理解为什么会发生这种情况,但没有找到解决办法


非常感谢您的任何建议。

我觉得您有些文件的列类型为double,有些文件的列类型为int。当您将表的列类型为double时,Athena最终将读取相应列为int的文件并抛出此错误,如果将表列键入int,则反之亦然

据我所知,Athena没有执行类型强制,但即使执行了,类型也不兼容:Athena中的双列不能表示拼花INT64列的所有可能值,Athena中的INT列不能表示浮点数(而对于拼花INT64,Athena中需要BIGINT列)


解决方案是确保所有文件都具有相同的架构。您可能需要在生成文件的代码中明确说明要生成的模式(例如,使其始终使用DOUBLE).

您是否尝试过将它们定义为字符串并在查询时将其转换为数字?您可以检查拼花文件的模式,并在创建Athena表时使用相同的数据类型。我想知道是否有办法修复以多种格式保存的数据。也许在某种程度上,在查询方面,让它更为宽松,或者在表示文件无法读取之前,考虑所有版本的胶水表。任何关于如何仍然从这样的数据中获得使用的信息都将非常有用。