如何解决HIVE_PARTITION_SCHEMA_MISMATCH问题?

12

我在S3上将数据分成了CSV文件的多个分区:

  • s3://bucket/dataset/p=1/*.csv (第1个分区)
  • ...
  • s3://bucket/dataset/p=100/*.csv (第100个分区)

我对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似乎包含三个不同的值:

  • true
  • false
  • [empty] (如...,,...)
可能有些行存在错别字,因此一些分区被分类为字符串——但这只是一种理论,由于文件数量和大小的原因,很难进行验证。

我还尝试了 MSCK REPAIR TABLE dataset,但没有用。

有没有快速解决方案?也许强制所有分区使用字符串?如果查看分区列表,则有一个未激活的“编辑模式”按钮。

还是我必须编写一个 Glue 作业来检查和丢弃或修复每一行?

2个回答

26

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

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


只有在我先从 Athena 中删除了表格时,它才对我起作用。 - Hrvoje

2

使用表中的元数据更新所有新的和现有的分区并不总是对我起作用,似乎原因通常是当我在不同的分区中具有不同数量的字段时。我得到的错误信息类似于:

There is a mismatch between the table and partition schemas,
The column 'a' in table 'tests.dataset' is declared as type 'string', but partition 'b' declared column 'c' as type 'boolean'

在分区中某些字段缺失,导致字段名称不同,Athena在比较它们时会忽略字段命名的差异。重新创建表格并使用爬虫生成的表格,然后使用`MSCK REPAIR TABLE my_new_table_name`更新分区是一种有帮助的方法。 如何创建新表格 之后删除爬虫生成的表格并使用新表格。上述解决方法可以在这里查看:https://aws.amazon.com/premiumsupport/knowledge-center/athena-hive-invalid-metadata-duplicate/

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接