如何创建具有不同列的分区的AWS Glue表?('HIVE_PARTITION_SCHEMA_MISMATCH')

42
根据这个AWS论坛帖子,有人知道如何使用AWS Glue创建一个包含不同模式的AWS Athena表的分区(在这种情况下,从表模式中选择不同的列子集)吗?
目前,当我在这些数据上运行爬虫,然后在Athena中进行查询时,会出现错误'HIVE_PARTITION_SCHEMA_MISMATCH' 我的用例是:
- 分区代表天 - 文件代表事件 - 每个事件是单个s3文件中的json blob - 事件包含不同列的子集(取决于事件类型) - 整个表的“模式”是所有事件类型的完整列集(由Glue爬虫正确组合) - 每个分区的“模式”是发生在那一天的事件类型的列子集(因此在Glue中,每个分区可能具有来自表模式的不同列子集) - 这种不一致导致了Athena中的错误
如果我要手动编写架构,我可以做到这一点,因为只会有一个表架构,并且JSON文件中缺少的键将被视为Nulls。
提前感谢!

我遇到了同样的问题,即分区模式在列顺序上不同。这是相同的数据,但他不够聪明,无法正确应用表模式。你解决了这个问题吗? - Hedrack
不幸的是,我没有解决这个问题。关于列顺序,您可以尝试编写作为换行符分隔的JSON格式。虽然不是理想的解决方案,但如果您使用gzip压缩文件,它不会对文件大小产生太大影响。祝你好运,如果您有任何发现,请告诉我! - rjmurt
定义几个爬虫(每个分区一个)不是解决方案吗? - Cherry
4个回答

66

我遇到了同样的问题,通过配置爬虫更新先前存在分区的表元数据来解决:

在此输入图片描述


2
我花了15分钟打一个问题,就在我要发送它之前,推荐出现了这个问题来检查。这节省了我几个小时的时间!谢谢。 - Moseleyi

5

这也解决了我的问题!如果有人想要使用 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
这帮了我很多。为了防止链接丢失,我将图片上传并分享给其他人。 enter image description here

0
尽管在爬虫的配置中选择了“使用表中的元数据更新所有新建和现有分区”,但它仍然偶尔未能为所有分区设置预期的参数(特别是在我的情况下未继承自表属性的jsonPath)。
https://docs.aws.amazon.com/athena/latest/ug/updates-and-partitions.html所建议,“删除导致错误的分区并重新创建”有所帮助。
在删除问题分区后,Glue爬虫在接下来的运行中正确地重新创建了它们。

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