自定义爬网程序行为 - AWS Glue

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

自定义爬网程序行为

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

Console

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

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

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

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

  • Add new columns only (仅添加新列) – 对于映射到 Amazon S3 数据存储的表,在发现新列时添加这些新列,但不删除或更改数据目录中的现有列的类型。当数据目录中的当前列正确且您不希望爬网程序删除或更改现有列的类型时,选择此选项。如果基本 Amazon S3 表属性(如分类、压缩类型或 CSV 分隔符)更改,将此表标记为已弃用。保留数据目录中存在的输入格式和输出格式。仅当 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 信息和架构。对表中的这些属性进行的任何更改都将传播到其分区。当在现有爬网程序上设置此配置选项时,将会更新现有分区,以便在下次爬网程序运行时与父表的属性相匹配。

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

  • 删除数据目录中的表和分区

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

    这是增量爬网的默认设置。

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

AWS CLI
aws glue create-crawler \ --name "your-crawler-name" \ --role "your-iam-role-arn" \ --database-name "your-database-name" \ --targets 'S3Targets=[{Path="s3://your-bucket-name/path-to-data"}]' \ --configuration '{"Version": 1.0, "CrawlerOutput": {"Partitions": {"AddOrUpdateBehavior": "InheritFromTable"}, "Tables": {"AddOrUpdateBehavior": "MergeNewColumns"}}}'
API

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

显示爬网程序配置选项的示例 python 代码

import boto3 import json # Initialize a boto3 client for AWS Glue glue_client = boto3.client('glue', region_name='us-east-1') # Replace 'us-east-1' with your desired AWS region # Define the crawler configuration crawler_configuration = { "Version": 1.0, "CrawlerOutput": { "Partitions": { "AddOrUpdateBehavior": "InheritFromTable" }, "Tables": { "AddOrUpdateBehavior": "MergeNewColumns" } } } configuration_json = json.dumps(crawler_configuration) # Create the crawler with the specified configuration response = glue_client.create_crawler( Name='your-crawler-name', # Replace with your desired crawler name Role='crawler-test-role', # Replace with the ARN of your IAM role for Glue DatabaseName='default', # Replace with your target Glue database name Targets={ 'S3Targets': [ { 'Path': "s3://your-bucket-name/path/", # Replace with your S3 path to the data }, ], # Include other target types like 'JdbcTargets' if needed }, Configuration=configuration_json, # Include other parameters like Schedule, Classifiers, TablePrefix, SchemaChangePolicy, etc., as needed ) print(response)a

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

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

  • LOG – 忽略更改,不更新数据目录中的表

    这是增量爬网的默认设置。

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

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

此选项对应于 AWS Glue 控制台上的 Add new columns only (仅添加新列) 选项。它仅覆盖通过对 Amazon S3 数据存储进行网络爬取生成的表的 SchemaChangePolicy 结构。如果您希望保留数据目录(可信来源)中存在的元数据,请选择此选项。在遇到新列时添加这些新列,包括嵌套数据类型。但是,不会删除现有列,且不会更改其类型。如果 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 – 删除数据目录中的表和分区。

  • LOG – 忽略更改。请勿更新数据目录。而是写入日志消息。

  • DEPRECATE_IN_DATABASE – 在数据目录中将表标记为已弃用。这是默认设置。