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

rjm*_*urt 28 amazon-s3 amazon-web-services amazon-athena aws-glue

根据此AWS论坛主题,是否有人知道如何使用AWS Glue创建AWS Athena表,其分区包含不同的模式(在这种情况下,表模式中的列的不同子集)?

目前,当我对此数据运行爬虫并在Athena中进行查询时,我收到错误 'HIVE_PARTITION_SCHEMA_MISMATCH'

我的用例是:

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

如果我要手动编写模式,我可以做到这一点,因为只有一个表模式,JSON文件中缺少的键将被视为Null.

提前致谢!

小智 37

我有同样的问题,通过配置crawler来更新预先存在的分区的表元数据来解决它:

在此输入图像描述

  • 我花了 15 分钟输入一个问题,就在发送之前,按照建议检查了这个问题。这节省了我几个小时!谢谢 (2认同)

ADV*_*-IT 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"
  }
}
Run Code Online (Sandbox Code Playgroud)