如何创建分区具有不同列的 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 多个表

AWS Glue:如何处理具有不同架构的嵌套 JSON

具有下推谓词的 AWS Glue Dynamic_frame 未正确过滤

AWS Glue Crawler 为每个分区添加表?

AWS Glue to Redshift:是否可以替换,更新或删除数据?