8

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

  • 真的
  • 错误的
  • [空](如...,,...)

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

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

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

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

4

2 回答 2

16

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

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

于 2019-09-26T18:03:10.823 回答
2

Update all new and existing partitions with metadata from the table并不总是对我有用,似乎原因通常是当我在不同的分区中有不同数量的字段时。我得到的错误是这样的:

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/

于 2021-03-02T12:09:16.320 回答