amazon-athena - 如何解决这个 HIVE_PARTITION_SCHEMA_MISMATCH?
问题描述
我在 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 作业检查并丢弃或修复每一行?
解决方案
如果您使用爬虫,您应该选择以下选项:
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
推荐阅读
- python - httpx Post 失败,Errno 32 Broken pipe
- elasticsearch - 在 ElasticSearch 上运行具有空值的 DateRange?
- python - 在 Python Pandas 中,搜索有 4 个连续行的值上升的位置
- c - 在非线性最小二乘 GSL 中固定拟合函数的参数
- flutter - 错误:没有为类“TextTheme”定义吸气剂“标题”
- javascript - 使用 Axios 向 Pinterest API 发出 post 请求
- php - 如何将数据库中的数据转换为关联数组 laravel 8?
- python - 在python中复制一个链表。我不知道如何在循环中添加一个新的空节点来链接最后一个节点
- javascript - 即使条件为假,do-while 循环仍在运行
- python - 多处理和for的python问题