如何创建分区具有不同列的 AWS Glue 表? ('HIVE_PARTITION_SCHEMA_MISMATCH')
Posted
技术标签:
【中文标题】如何创建分区具有不同列的 AWS Glue 表? (\'HIVE_PARTITION_SCHEMA_MISMATCH\')【英文标题】:How to create AWS Glue table where partitions have different columns? ('HIVE_PARTITION_SCHEMA_MISMATCH')如何创建分区具有不同列的 AWS Glue 表? ('HIVE_PARTITION_SCHEMA_MISMATCH') 【发布时间】:2018-02-24 17:39:17 【问题描述】:根据AWS Forum Thread,有谁知道如何使用 AWS Glue 创建一个 AWS Athena 表,其分区包含不同的架构(在本例中是来自表架构的不同列子集)?
目前,当我对这些数据运行爬虫然后在 Athena 中进行查询时,我收到错误 'HIVE_PARTITION_SCHEMA_MISMATCH'
我的用例是:
分区代表天 文件代表事件 每个事件都是单个 s3 文件中的 json blob 事件包含列的子集(取决于事件类型) 整个表的“模式”是所有事件类型的完整列集(这由 Glue 爬虫正确组合在一起) 每个分区的“架构”是当天发生的事件类型的列子集(因此在 Glue 中,每个分区可能具有与表架构不同的列子集) 我认为这种不一致会导致 Athena 出现错误如果我要手动编写一个模式,我可以很好地做到这一点,因为只有一个表模式,并且 JSON 文件中缺少的键将被视为 Null。
提前致谢!
【问题讨论】:
我有同样的问题,分区模式在列顺序上不同。它的数据相同,但他不够聪明,无法正确应用表模式。你解决问题了吗? 不,很遗憾,我没有解决这个问题。在列顺序方面,您可以尝试编写为换行符分隔的 JSON。这并不理想,但我认为如果你 gzip 文件,它不会对大小产生巨大的影响。祝你好运,如果你学到了什么,请告诉我! 定义多个爬虫(每个分区一个)不是解决方案吗? 【参考方案1】:我遇到了同样的问题,通过配置爬虫来更新预先存在的分区的表元数据解决了这个问题:
【讨论】:
我花了 15 分钟输入一个问题,就在发送它之前,这个问题是按照建议检查的。这为我节省了几个小时!谢谢【参考方案2】:这对我有帮助。为其他人发布图片以防链接丢失
【讨论】:
【参考方案3】:它也解决了我的问题! 如果有人需要使用 Terraform 配置此配置爬虫,那么我就是这样做的:
resource "aws_glue_crawler" "crawler-s3-rawdata"
database_name = "my_glue_database"
name = "my_crawler"
role = "my_iam_role.arn"
configuration = <<EOF
"Version": 1.0,
"CrawlerOutput":
"Partitions": "AddOrUpdateBehavior": "InheritFromTable"
EOF
s3_target
path = "s3://mybucket"
【讨论】:
【参考方案4】:尽管在爬虫的配置中选择了Update all new and existing partitions with metadata from the table.
,它仍然偶尔无法为所有分区设置预期的参数(特别是在我的例子中jsonPath
不是从表的属性中继承的)。
正如https://docs.aws.amazon.com/athena/latest/ug/updates-and-partitions.html 中所建议的,“删除导致错误的分区并重新创建它”很有帮助
删除有问题的分区后,胶水爬虫在接下来的运行中正确地重新创建了它们
【讨论】:
以上是关于如何创建分区具有不同列的 AWS Glue 表? ('HIVE_PARTITION_SCHEMA_MISMATCH')的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 AWS Glue Crawler 读取 PostgreSQL 表分区?
AWS Glue 不检测分区并在目录中创建 1000 多个表