【问题标题】:AWS Glue Python Job not creating new Data Catalog partitionsAWS Glue Python 作业未创建新的数据目录分区
【发布时间】:2021-06-16 06:09:14
【问题描述】:

我使用 Glue Studio 创建了一个 AWS Glue 作业。 它从 Glue 数据目录中获取数据,进行一些转换,然后写入不同的数据目录。

在配置目标节点时,我启用了运行后创建新分区的选项:

作业成功运行,数据以正确的分区文件夹结构写入 S3,但在实际数据目录表中没有创建新分区 - 我仍然需要运行 Glue Crawler 来创建它们。

生成的脚本中负责创建分区的代码是这样的(作业的最后两行):

DataSink0 = glueContext.write_dynamic_frame.from_catalog(frame = Transform4, database = "tick_test", table_name = "test_obj", transformation_ctx = "DataSink0", additional_options = {"updateBehavior":"LOG","partitionKeys":["date","provider"],"enableUpdateCatalog":True})
job.commit()

我做错了什么?为什么没有创建新分区?如何避免必须运行爬虫才能在 Athena 中获取数据?

我正在使用 Glue 2.0 - PySpark 2.4

【问题讨论】:

  • 只是一个问题:您是否必须在每次运行作业时都运行爬虫(使用相同的架构)?因为预期在更改后运行一次爬虫,但未来运行应该没有必要。
  • 是的,我愿意,因为 Glue 作业不会在数据目录中创建新分区。

标签: amazon-web-services pyspark apache-spark-sql aws-glue aws-glue-spark


【解决方案1】:

正如documentation 中强调的那样,向数据目录添加新分区存在限制,更具体地说,请确保您的用例不与以下任何内容相矛盾:

仅支持 Amazon Simple Storage Service (Amazon S3) 目标。

仅支持以下格式:json、csv、avro 和 镶木地板。

要使用 parquet 分类创建或更新表,您必须使用适用于 DynamicFrames 的 AWS Glue 优化 parquet 编写器。

当 updateBehavior 设置为 LOG 时,会添加新的分区 仅当 DynamicFrame 架构等效于或包含子集时 数据目录表的架构中定义的列。

您的 partitionKeys 必须相同,并且顺序相同, 您在 ETL 脚本中传递的参数和您的 partitionKeys 数据目录表架构。

【讨论】:

  • 所有这些都适用于我的用例。
  • 我可以确认这解决了我的问题(我使用的是 ORC 而不是 Parquet。 - @gshpychka 检查您是否也在使用胶水优化的镶木地板编写器,以及您是否拥有更新架构的正确权限。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-10
  • 2019-02-21
  • 2021-02-10
  • 2022-12-03
  • 2018-06-18
相关资源
最近更新 更多