配置爬网程序 - AWS Glue
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

配置爬网程序

当爬网程序运行时,它可能会遇到导致架构或分区与以前的爬网不同的数据存储更改。您可以使用 AWS 管理控制台或 AWS Glue API 来配置爬网程序如何处理某些类型的更改。

在 AWS Glue 控制台上配置爬网程序

当您使用 AWS Glue 控制台定义爬网程序时,有多个选项可用于配置爬网程序的行为。有关使用 AWS Glue 控制台添加爬网程序的更多信息,请参阅在 AWS Glue 控制台上使用爬网程序

当爬网程序针对以前已爬网的数据存储运行时,可能会发现架构已更改或数据存储中的一些对象已被删除。爬网程序将记录架构更改。根据爬网程序的源类型,可能创建新的表和分区,而不考虑架构更改策略。

要指定爬网程序在发现架构中的更改时执行什么操作,您可以在控制台上选择下列操作之一:

  • Update the table definition in the Data Catalog (更新数据目录中的表定义) – 在 AWS Glue 数据目录中添加新列、删除缺少的列并修改现有列的定义。删除爬网程序未设置的任何元数据。这是默认设置。

  • Add new columns only (仅添加新列) – 对于映射到 Amazon S3 数据存储的表,在发现新列时添加这些新列,但不删除或更改Data Catalog中的现有列的类型。当Data Catalog中的当前列正确且您不希望爬网程序删除或更改现有列的类型时,选择此选项。如果基本 Amazon S3 表属性(如分类、压缩类型或 CSV 分隔符)更改,将此表标记为已弃用。保留Data Catalog中存在的输入格式和输出格式。仅当 SerDe 参数是由爬网程序设置时,才更新该参数。对于所有其他数据存储,修改现有列定义。

  • Ignore the change and don't update the table in the Data Catalog (忽略更改,不更新数据目录中的表) – 只创建新表和分区。

爬网程序可能还发现新的或更改的分区。默认情况下,会添加新分区,如果现有分区已更改,则会更新它们。此外,您还可以在 AWS Glue 控制台上将爬网程序配置选项设置为 Update all new and existing partitions with metadata from the table (使用表中的元数据更新所有新的和现有的分区)。设置此选项后,分区会从其父表中继承元数据属性 —— 如分类、输入格式、输出格式、SerDe 信息和架构。对表中的这些属性进行的任何更改都将传播到其分区。当在现有爬网程序上设置此配置选项时,将会更新现有分区,以便在下次爬网程序运行时与父表的属性相匹配。

要指定爬网程序在数据存储中找到已删除对象时执行什么操作,请选择下列操作之一:

  • Delete tables and partitions from the Data Catalog (删除数据目录中的表和分区)

  • Ignore the change and don't update the table in the Data Catalog (忽略更改,不更新数据目录中的表)

  • Mark the table as deprecated in the Data Catalog (在数据目录中将表标记为已弃用) – 这是默认设置。

使用 API 配置爬网程序

当使用 AWS Glue API 定义爬网程序时,您可以从多个字段中选择来配置爬网程序。爬网程序 API 中的 SchemaChangePolicy 确定爬网程序在发现已更改的架构或已删除的对象时执行什么操作。爬网程序在运行时记录架构更改。

当爬网程序运行时,无论架构更改策略如何,都始终会创建新的表和分区。您可以在 SchemaChangePolicy 结构中的 UpdateBehavior 字段中选择以下操作之一来确定爬网程序在发现更改的表架构时执行什么操作:

  • UPDATE_IN_DATABASE – 更新 AWS Glue 数据目录中的表。添加新列、删除缺少的列并修改现有列的定义。删除爬网程序未设置的任何元数据。

  • LOG – 忽略更改,不更新Data Catalog中的表。

您也可以使用爬网程序 API Configuration 字段中提供的 JSON 对象覆盖 SchemaChangePolicy 结构。此 JSON 对象可以包含键–值对以将策略设置为不更新现有列并仅添加新列。例如,以字符串形式提供以下 JSON 对象:

{ "Version": 1.0, "CrawlerOutput": { "Tables": { "AddOrUpdateBehavior": "MergeNewColumns" } } }

此选项对应于 AWS Glue 控制台上的 Add new columns only (仅添加新列) 选项。它仅覆盖通过对 Amazon S3 数据存储进行爬网生成的表的 SchemaChangePolicy 结构。如果您希望保留Data Catalog(可信来源)中存在的元数据,请选择此选项。在遇到新列时添加这些新列,包括嵌套数据类型。但是,不会删除现有列,且不会更改其类型。如果 Amazon S3 表属性显著更改,将此表标记为已弃用,并记录一条警告,指示需要解决不兼容的属性。

当爬网程序针对以前爬取的数据存储运行时,它可能会发现新的或已更改的分区。默认情况下,会添加新分区,如果现有分区已更改,则会更新它们。此外,您还可以将爬网程序配置选项设置为 InheritFromTable(对应于 AWS Glue 控制台上的 Update all new and existing partitions with metadata from the table (使用表中的元数据更新所有新的和现有的分区) 选项)。设置此选项后,分区会继承其父表中的元数据属性,如分类、输入格式、输出格式、SerDe 信息和架构。对父表进行的任何属性更改都将传播到其分区。

当在现有爬网程序上设置此配置选项时,将会更新现有分区,以便在下次爬网程序运行时与父表的属性相匹配。在爬网程序 API Configuration 字段中设置此行为。例如,以字符串形式提供以下 JSON 对象:

{ "Version": 1.0, "CrawlerOutput": { "Partitions": { "AddOrUpdateBehavior": "InheritFromTable" } } }

爬网程序 API Configuration 字段可以设置多个配置选项。例如,要配置分区和表的爬网程序输出,可以提供以下 JSON 对象的字符串表示形式:

{ "Version": 1.0, "CrawlerOutput": { "Partitions": { "AddOrUpdateBehavior": "InheritFromTable" }, "Tables": {"AddOrUpdateBehavior": "MergeNewColumns" } } }

您可以选择下列操作之一来确定爬网程序在数据存储中找到已删除对象时执行什么操作。爬网程序 API 中的 SchemaChangePolicy 结构中的 DeleteBehavior 字段设置爬网程序在发现已删除对象时的行为。

  • DELETE_FROM_DATABASE – 删除Data Catalog中的表和分区。

  • LOG – 忽略更改。请勿更新 Data Catalog。而是写入日志消息。

  • DEPRECATE_IN_DATABASE – 在Data Catalog中将表标记为已弃用。这是默认设置。

如何阻止爬网程序更改现有架构

如果您不希望爬网程序覆盖您对 Amazon S3 表定义中的现有字段进行的更新,请在控制台上选择选项 Add new columns only (仅添加新列) 或设置配置选项 MergeNewColumns。这适用于表和分区,除非 Partitions.AddOrUpdateBehavior 被覆盖为 InheritFromTable

如果您不希望在爬网程序运行时更改表架构,请将架构更改策略设置为 LOG。您还可以设置将分区架构设置为从表继承的配置选项。

如果您在控制台上配置爬网程序,可以选择以下操作:

  • Ignore the change and don't update the table in the Data Catalog (忽略更改,不更新数据目录中的表)

  • Update all new and existing partitions with metadata from the table (使用表中的元数据更新所有新的和现有的分区)

当您使用 API 配置爬网程序时,请设置以下参数:

  • SchemaChangePolicy 结构中的 UpdateBehavior 字段设置为 LOG

  • 使用爬网程序 API 中的以下 JSON 对象的字符串表示形式设置 Configuration 字段;例如:

    { "Version": 1.0, "CrawlerOutput": { "Partitions": { "AddOrUpdateBehavior": "InheritFromTable" } } }

如何为每个 Amazon S3 包含路径创建单个架构

默认情况下,当爬网程序为 Amazon S3 中存储的数据定义表时,它会同时考虑数据兼容性和架构相似性。它考虑的数据兼容性因素包括数据是否具有相同的格式(例如,JSON),相同的压缩类型(例如,GZIP),Amazon S3 路径的结构以及其他数据属性。架构相似性衡量单独 Amazon S3 对象的架构的相似程度。

您可以在可能的情况下将 CombineCompatibleSchemas 的爬网程序配置为公用表定义。使用此选项,爬网程序仍会考虑数据兼容性,但在评估指定包含路径中的 Amazon S3 对象时会忽略特定架构的相似性。

如果要在控制台上配置爬网程序以组合架构,请选择爬网程序选项 Create a single schema for each S3 path (为每个 S3 路径创建单个架构)

当您使用 API 配置爬网程序时,请设置以下配置选项:

  • 使用爬网程序 API 中的以下 JSON 对象的字符串表示形式设置 Configuration 字段;例如:

    { "Version": 1.0, "Grouping": { "TableGroupingPolicy": "CombineCompatibleSchemas" } }

为帮助说明此选项,假设您使用包含路径 s3://bucket/table1/ 定义了一个爬网程序。当该爬网程序运行时,它会找到两个具有以下特征的 JSON 文件:

  • 文件 1S3://bucket/table1/year=2017/data1.json

  • 文件内容{“A”: 1, “B”: 2}

  • 架构A:int, B:int

  • 文件 2S3://bucket/table1/year=2018/data2.json

  • 文件内容{“C”: 3, “D”: 4}

  • 架构C: int, D: int

默认情况下,该爬网程序会创建两个名为 year_2017year_2018 的表,因为架构不够相似。但是,如果选项 Create a single schema for each S3 path (为每个 S3 路径创建单个架构)处于选中状态,并且数据是兼容的,则爬网程序会创建一个表。该表具有架构 A:int,B:int,C:int,D:intpartitionKey year:string