创建表格、更新架构并在 Data Catalog 从起 AWS Glue ETL职位 - AWS Glue
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

如果我们为英文版本指南提供翻译,那么如果存在任何冲突,将以英文版本指南为准。在提供翻译时使用机器翻译。

创建表格、更新架构并在 Data Catalog 从起 AWS Glue ETL职位

您的提取、转换和加载 (ETL) 作业可能会在目标数据存储中创建新的表分区。您的数据集架构可以从 AWS Glue Data Catalog 架构随时间推移。 AWS GlueETL作业现在提供了一些可以在ETL脚本内使用的功能,以便在 Data Catalog. 这些功能允许您在 Data Catalog 中查看 ETL 工作的结果,而无需重新运行爬网程序。

新分区

如果要在 AWS Glue 数据目录 中查看新分区,可以执行以下操作之一:

  • 在作业完成后,重新运行爬网程序,并在爬网程序完成后,在控制台上查看新分区。

  • 一旦作业完成,即可在控制台上查看新分区,而无需重新运行爬网程序。可以通过向 ETL 脚本添加几行代码来启用此功能,如以下示例中所示。代码使用 enableUpdateCatalog 指示这些数据 Data Catalog 将在作业运行期间更新,因为创建新分区。

方法 1:

通过 enableUpdateCatalogpartitionKeys 在选项参数中。

Python
additionalOptions = {"enableUpdateCatalog": True} additionalOptions["partitionKeys"] = ["region", "year", "month", "day"] sink = glueContext.write_dynamic_frame_from_catalog(frame=last_transform, database=<target_db_name>, table_name=<target_table_name>, transformation_ctx="write_sink", additional_options=additionalOptions)
Scala
val options = JsonOptions(Map("path" -> <S3_output_path>, "partitionKeys" -> Seq("region", "year", "month", "day"), "enableUpdateCatalog" -> true)) val sink = glueContext.getCatalogSink(database = <target_db_name>, tableName = <target_table_name>, additionalOptions = options) sink.writeDynamicFrame(df)
方法 2:

通过 enableUpdateCatalogpartitionKeysgetSink(),并致电 setCatalogInfo()DataSink 对象。

Python
sink = glueContext.getSink(connection_type="s3", path="<S3_output_path>", enableUpdateCatalog=True, partitionKeys=["region", "year", "month", "day"]) sink.setFormat("json") sink.setCatalogInfo(catalogDatabase=<target_db_name>, catalogTableName=<target_table_name>) sink.writeFrame(last_transform)
Scala
val options = JsonOptions(Map("path" -> <S3_output_path>, "partitionKeys" -> Seq("region", "year", "month", "day"), "enableUpdateCatalog" -> true)) val sink = glueContext.getSink("s3", options).withFormat("json") sink.setCatalogInfo(<target_db_name>, <target_table_name>) sink.writeDynamicFrame(df)

现在,您可以创建新目录表格,更新已修改架构的现有表格,并在 Data Catalog 使用 AWS Glue ETL作业本身,无需重新运行爬行器。

更新表架构

如果要覆盖 Data Catalog 表的架构,可以执行以下操作之一:

  • 作业完成后,重新运行爬网程序,并确保您的爬网程序也已配置为更新表定义。当爬网程序完成时,在查控制台上看新分区以及任何架构更新。有关详细信息,请参阅 使用API配置爬探器.

  • 一旦作业完成,即可在控制台上查看修改的架构,而无需重新运行爬网程序。可以通过向 ETL 脚本添加几行代码来启用此功能,如以下示例中所示。代码使用 enableUpdateCatalog 设置为真实,同时也是 updateBehavior 设置为 UPDATE_IN_DATABASE,这表示覆盖架构并在 Data Catalog 在工作运行期间。

Python
additionalOptions = {"enableUpdateCatalog": True, "updateBehavior": "UPDATE_IN_DATABASE"} additionalOptions["partitionKeys"] = ["partition_key0", "partition_key1"] sink = glueContext.write_dynamic_frame_from_catalog(frame=last_transform, database=<dst_db_name>, table_name=<dst_tbl_name>, transformation_ctx="write_sink", additional_options=additionalOptions) job.commit()
Scala
val options = JsonOptions(Map("path" -> outputPath, "partitionKeys" -> Seq("partition_0", "partition_1"), "enableUpdateCatalog" -> true)) val sink = glueContext.getCatalogSink(database = nameSpace, tableName = tableName, additionalOptions = options) sink.writeDynamicFrame(df)

您还可以将 updateBehavior 值为 LOG 如果您想防止表架构被覆盖,但仍希望添加新分区。默认值 updateBehaviorUPDATE_IN_DATABASE,如果您未明确定义它,则表架构将被覆盖。

IFIFIF enableUpdateCatalog 不会设置为true,无论选择哪个选项 updateBehavior,ETL工作将不会更新 Data Catalog.

创建新表

还可以使用相同的选项在 中创建新表。Data Catalog. 您可以使用 指定数据库和新表名。setCatalogInfo.

Python
sink = glueContext.getSink(connection_type="s3", path="s3://path/to/data", enableUpdateCatalog=True, updateBehavior="UPDATE_IN_DATABASE", partitionKeys=["partition_key0", "partition_key1"]) sink.setFormat("<format>") sink.setCatalogInfo(catalogDatabase=<dst_db_name>, catalogTableName=<dst_tbl_name>) sink.writeFrame(last_transform)
Scala
val options = JsonOptions(Map("path" -> outputPath, "partitionKeys" -> Seq("<partition_1>", "<partition_2>"), "enableUpdateCatalog" -> true, "updateBehavior" -> "UPDATE_IN_DATABASE")) val sink = glueContext.getSink(connectionType = "s3", options = options).withFormat("<format>") sink.setCatalogInfo(catalogDatabase = “<dst_db_name>”, catalogTableName = “<dst_tbl_name>”) sink.writeDynamicFrame(df)

Restrictions

请注意以下限制:

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

  • 仅支持以下格式: jsoncsvavro,和 glueparquet.

  • 已创建或更新表格 glueparquet 分类不能用作其他职位的数据源。

  • updateBehavior 设置为 LOG,只有在新分区中的 DynamicFrame 框架等同于或包含在 Data Catalog 表的框架。

  • 在 ETL 脚本中传递的参数与 Data Catalog 表架构中的 partitionKey 之间,您的 partitionKeys 必须是等效的且顺序相同。

  • 此功能目前尚未支持更新/创建更新框架,其中更新框架已嵌套(例如,结构内的阵列)。

有关更多信息,请参阅 ETL 脚本编程.