我在 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 作业检查并丢弃或修复每一行?