首页 > 解决方案 > 如何解决这个 HIVE_PARTITION_SCHEMA_MISMATCH?

问题描述

我在 S3 上的 CSV 文件中对数据进行了分区:

我在 s3://bucket/dataset/ 上运行了一个分类器,结果看起来很有希望,因为它检测到 150 列(c1、...、c150)并分配了各种数据类型。

在 Athena 中加载结果表并查询 ( select * from dataset limit 10) 它会产生错误消息:

HIVE_PARTITION_SCHEMA_MISMATCH:表和分区模式不匹配。类型不兼容,不能强制。表“tests.dataset”中的“c100”列被声明为“string”类型,但分区“AANtbd7L1ajIwMTkwOQ”将“c100”列声明为“boolean”类型。

首先,我不知道如何使用“AANtbd7L1ajIwMTkwOQ”……但我可以从 Glue 中的分区列表中看出,有些分区的 c100 被归类为字符串,而有些则被归类为布尔值。而表架构将其列为字符串。

这也意味着,如果我将查询限制为将 c100 分类为与表模式一致的字符串的分区,则查询将起作用。如果我使用将 c100 分类为布尔值的分区,则查询将失败并显示上述错误消息。

现在查看一些 CSV 列 c100 似乎包含三个不同的值:

可能某些行包含拼写错误(可能),因此某些分区被归类为字符串 - 但这只是一个理论,由于文件的数量和大小而难以验证。

我也试MSCK REPAIR TABLE dataset了也没用。

有没有快速的解决方案?也许强制所有分区使用字符串?如果我查看分区列表,则会有一个停用的“编辑架构”按钮。

或者我是否必须编写一个 Glue 作业检查并丢弃或修复每一行?

标签: amazon-athenaaws-glueaws-glue-data-catalog

解决方案


如果您使用爬虫,您应该选择以下选项:

Update all new and existing partitions with metadata from the table

您也可以在创建表格时这样做。检查https://docs.aws.amazon.com/glue/latest/dg/crawler-configuration.html#crawler-schema-changes-prevent了解更多详情。

这应该可以解决问题。如果没有,请检查https://github.com/awsdocs/amazon-athena-user-guide/blob/master/doc_source/glue-best-practices.md#schema-syncing上的其他选项

要了解 athena 中的问题,请查看https://docs.aws.amazon.com/athena/latest/ug/updates-and-partitions.html


推荐阅读