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

时间:2017-09-15 13:44:54

标签: amazon-web-services amazon-s3 amazon-athena aws-glue

根据这个AWS Forum Thread,有没有人知道如何使用AWS Glue创建一个AWS Athena表,其分区包含不同的模式(在这种情况下,表模式中的列的不同子集)?

目前,当我在此数据上运行抓取工具然后在Athena中进行查询时,我收到错误'HIVE_PARTITION_SCHEMA_MISMATCH'

我的用例是:

  • 分区代表天数
  • 文件代表事件
  • 每个事件都是单个s3文件中的json blob
  • 事件包含列的子集(取决于事件的类型)
  • 整个表的'schema'是所有事件类型的完整列(这是由Glue crawler正确组合的)
  • 每个分区的“架构”是当天发生的事件类型的列的子集(因此在Glue中,每个分区可能具有与表架构不同的列子集)。
  • 这种不一致导致Athena的错误我认为

如果我要手动编写模式,我可以做得很好,因为只有一个表模式,而JSON文件中缺少的密钥将被视为Null。

提前致谢!

4 个答案:

答案 0 :(得分:29)

我遇到了同样的问题,通过配置抓取工具来更新预先存在的分区的表元数据来解决它:

enter image description here

答案 1 :(得分:2)

这对我有帮助。在链接丢失的情况下为他人发布图像 enter image description here

答案 2 :(得分:0)

这也解决了我的问题! 如果有人需要使用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"
  }
}

答案 3 :(得分:0)

尽管在搜寻器的配置中选择了Update all new and existing partitions with metadata from the table.,但偶尔仍然无法为所有分区设置预期的参数(特别是jsonPath并不是从表的属性继承的)。

https://docs.aws.amazon.com/athena/latest/ug/updates-and-partitions.html中的建议,“删除导致错误的分区并重新创建”有助于

删除有问题的分区后,g胶爬虫在以下运行中正确地重新创建了它们