爬网程序属性
使用 Amazon Glue 控制台或 Amazon Glue API 定义爬网程序时,您可以指定以下信息:
- 爬网程序名称以及可选描述符和设置
-
设置包含标签、安全配置和自定义分类器。您可以先定义自定义分类器,然后再定义爬网程序。有关更多信息,请参阅下列内容:
- 爬网程序源类型
-
爬网程序可以直接访问数据存储作为爬取的源,也可以使用数据目录中的现有表作为源。如果爬网程序使用现有目录表,它将爬取由这些目录表指定的数据存储。有关更多信息,请参阅爬网程序源类型。
- 仅爬取 S3 数据源的新文件夹
-
如果启用此选项,则仅爬取自上次爬网程序运行以来添加的 Amazon S3 文件夹。有关更多信息,请参阅Amazon Glue 中的增量爬网。
- 爬网程序源:数据存储或目录表
-
从以下选项中进行选择:
-
一个或多个数据存储
一个爬网程序可以爬取多个不同类型的数据存储(Amazon S3、JDBC 等)。
-
数据目录表列表
目录表指定要爬取的数据存储。爬网程序在单次运行中只能爬取目录表;它无法混用其他源类型。
您一次只能配置一个数据存储。提供连接信息并包含路径和排除模式后,您可以选择添加另一个数据存储。
有关更多信息,请参阅爬网程序源类型。
-
- 其他爬网程序源参数
-
每种源类型都需要一组不同的附加参数。以下是一个不完整的列表:
- 连接
-
选择或添加 Amazon Glue 连接。有关连接的信息,请参阅 在 Amazon Glue Data Catalog 中定义连接。
- 启用数据采样(仅适用于 Amazon DynamoDB、MongoDB 和 Amazon DocumentDB 数据存储)
-
选择是否仅对数据样本进行爬网。如果未选择该选项,则对整个表进行爬网。当表不是高吞吐量表时,扫描所有记录会花费很长时间。
- 启用写入清单(仅适用于 Delta Lake 数据存储)
-
选择是否检测 Delta Lake 事务处理日志中的表元数据或 Schema 更改;它会重新生成清单文件。如果已经使用 Delta Lake
SET TBLPROPERTIES配置了自动清单更新,则不应选择此选项。 - 扫描速率(仅适用于 DynamoDB 数据存储)
-
指定 Amazon Glue 爬网程序使用的已配置读取容量单位的百分比。读取容量单位是一个由 DynamoDB 定义的术语,它是一个数值,用作每秒可对表执行的读取次数的速率限制器。请输入介于 0.1 和 1.5 之间的值。如果未指定,则该值默认为 0.5(对于预配置的表)和配置的最大容量的 1/4(对于按需表)。请注意,只应将预置容量模式与 Amazon Glue 网络爬取程序结合使用。
注意 对于 DynamoDB 数据存储,请设置预置容量模式来处理表的读写。Amazon Glue 网络爬取程序不应与按需容量模式结合使用。
- 样本大小(可选)(仅适用于 Amazon S3 数据存储)
-
指定爬取数据集中的示例文件时要网络爬取的每个叶文件夹中的文件数。启用此功能后,爬网程序会随机选择每个叶文件夹中的一些文件进行网络爬取,而不是网络爬取此数据集中的所有文件。
采样爬网程序最适合于先前了解其数据格式并知道其文件夹中的架构不会更改的客户。启用此功能将显著减少爬网程序运行时间。
有效值是介于 1 到 249 之间的整数。如果未指定,则对所有文件进行爬取。
- 包含路径
-
- 对于 Amazon S3 数据存储
-
选择是在您的账户还是其他账户中指定路径,然后浏览以选择 Amazon S3 路径。
- 对于 Delta Lake 数据存储
-
将一个或多个指向 Delta 表的 Amazon S3 路径,格式为 s3://
bucket/prefix/object。 - 对于 JDBC 数据存储
-
输入
<database>/<schema>/<table>或<database>/<table>,具体取决于数据库产品。Oracle Database 和 MySQL 不支持路径中的架构。您可以用百分比 (%) 字符替换<schema>或<table>。例如,对于系统标识符 (SID) 为orcl的 Oracle 数据库,输入orcl/%以导入连接中指定的用户有权访问的所有表。重要 此字段区分大小写。
- 对于 MongoDB 或 Amazon DocumentDB 数据存储
-
输入
database/collection。
有关更多信息,请参阅包含和排除模式。
- 排除模式
-
您可以使用这些模式从爬取中排除某些文件或表。有关更多信息,请参阅包含和排除模式。
- IAM 角色
-
爬网程序将担任此角色。它必须具有类似于 Amazon 托管式策略
AWSGlueServiceRole的权限。对于 Amazon S3 和 DynamoDB 源,它还必须具有访问数据存储的权限。如果爬网程序读取使用 Amazon Key Management Service(Amazon KMS)加密的 Amazon S3 数据,则该角色必须具有 Amazon KMS 密钥的解密权限。对于 Amazon S3 数据存储,附加到角色的其他权限类似于以下内容:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:GetObject", "s3:PutObject" ], "Resource": [ "arn:aws:s3:::bucket/object*" ] } ] }对于 Amazon DynamoDB 数据存储,附加到角色的其他权限类似于以下内容:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "dynamodb:DescribeTable", "dynamodb:Scan" ], "Resource": [ "arn:aws:dynamodb:region:account-id:table/table-name*" ] } ] }有关更多信息,请参阅步骤 2:为 Amazon Glue 创建 IAM 角色和管理 Amazon Glue 资源的访问权限。
- 爬网程序计划
-
您可以按需运行爬网程序,或制定计划以自动运行爬网程序。有关更多信息,请参阅计划 Amazon Glue 爬网程序。
- 数据目录中用于所创建的目录表的目标数据库
-
有关更多信息,请参阅Amazon Glue 数据库。
- 输出配置选项
-
选项包括爬网程序应如何处理检测到的架构更改、数据存储中的已删除对象等等。有关更多信息,请参阅设置爬网程序配置选项。
- 重新爬取策略
-
在第一次网络爬取完成后对 Amazon S3 数据源进行网络爬取时,请选择是再次网络爬取整个数据集还是仅网络爬取自上次爬网程序运行以来添加的文件夹。有关更多信息,请参阅Amazon Glue 中的增量爬网。
爬网程序源类型
爬网程序可以直接访问数据存储作为爬取的源,也可以使用现有目录表作为源。如果爬网程序使用现有目录表,它将爬取由这些目录表指定的数据存储。
将目录表指定为源的常见原因是在您手动创建该表(因为您已经知道数据存储的结构)时,您希望爬网程序让表保持更新,包括添加新分区。有关其他原因的讨论,请参阅使用爬网程序更新手动创建的数据目录表。
当您指定现有表作为爬网程序源类型时,以下条件适用:
-
数据库名称是可选的。
-
仅允许指定 Amazon S3 或 Amazon DynamoDB 数据存储的目录表。
-
爬网程序运行时,不会创建新的目录表。根据需要更新现有表,包括添加新分区。
-
将忽略在数据存储中找到的已删除对象;不删除目录表。而是由爬网程序写入日志消息。(
SchemaChangePolicy.DeleteBehavior=LOG) -
默认情况下启用为每个 Amazon S3 路径创建单一架构的爬网程序配置选项,且不能禁用此选项。(
TableGroupingPolicy=CombineCompatibleSchemas)有关更多信息,请参阅如何为每个 Amazon S3 包含路径创建单个架构。 -
您不能将目录表与任何其他源类型(例如 Amazon S3 或 Amazon DynamoDB)混用来作为源。
包含和排除模式
在评估要在爬取中包含或排除的内容时,爬网程序首先评估所需的包含路径。对于 Amazon S3、MongoDB、Amazon DocumentDB (with MongoDB compatibility) 和关系数据存储,您必须指定包含路径。
对于 Amazon S3 数据存储,包含路径语法为 bucket-name/folder-name/file-name.ext。要网络爬取存储桶中的所有对象,只需在包含路径中指定存储桶名称。排除模式与包含路径是相对的
对于 MongoDB 和 Amazon DocumentDB (with MongoDB compatibility),语法为 database/collection。
对于 JDBC 数据存储,语法为 database-name/schema-name/table-name 或 database-name/table-name。语法取决于数据库引擎是否支持数据库中的架构。例如,对于 MySQL 或 Oracle 等数据库引擎,请不要在包含路径中指定 schema-name。您可以用百分号 (%) 取代包含路径中的架构或表,以表示数据库中的所有架构或所有表。您不能用百分号 (%) 取代包含路径中的数据库。排除路径与包含路径是相对的。例如,要排除 JDBC 数据存储中的一个表,请在排除路径中键入该表的名称。
爬网程序使用包含 JDBC URI 连接字符串的 Amazon Glue 连接连接到 JDBC 数据存储。该爬网程序只能使用 Amazon Glue 连接中的 JDBC 用户名和密码来访问数据库引擎中的对象。爬网程序只能创建它通过 JDBC 连接可以访问的表。在爬网程序使用 JDBC URI 访问数据库引擎后,包含路径用于确定在数据目录中创建了数据库引擎中的哪些表。例如,对于 MySQL,如果您指定包含路径 MyDatabase/%,则 MyDatabase 中的所有表都是在数据目录中创建的。访问 Amazon Redshift 时,如果您指定包含路径 MyDatabase/%,则数据库 MyDatabase 的所有架构中的所有表都是在数据目录中创建的。如果您指定包含路径 MyDatabase/MySchema/%,则会创建数据库 MyDatabase 和架构 MySchema 中的所有表。
指定包含路径后,您可以通过指定一个或多个 Unix 样式 glob 排除模式,从网络爬取中排除对象 (否则您的包含路径会包括它)。这些模式应用于您的包含路径,以确定哪些对象被排除。这些模式也会存储为由爬网程序创建的表的属性。Amazon GluePySpark 扩展(例如 create_dynamic_frame.from_catalog)读取表属性并排除由排除模式定义的对象。
Amazon Glue 在排除模式中支持以下类型的 glob 模式。
| 排除模式 | 描述 |
|---|---|
*.csv |
与表示当前文件夹中以 .csv 结尾的对象名称的 Amazon S3 路径匹配 |
*.* |
与包含点的所有对象名称匹配 |
*.{csv,avro} |
与以 .csv 或 .avro 结尾的对象名称匹配 |
foo.? |
与以 foo. 开头,后跟单个字符扩展名的对象名称匹配 |
myfolder/* |
与 myfolder 的一个级别子文件夹中的对象匹配,例如 /myfolder/mysource |
myfolder/*/* |
与 myfolder 的两个级别子文件夹中的对象匹配,例如 /myfolder/mysource/data |
myfolder/** |
与 myfolder 的所有子文件夹中的对象匹配,例如 /myfolder/mysource/mydata 和 /myfolder/mysource/data |
myfolder** |
匹配子文件夹 myfolder 以及 myfolder 下的文件,如 /myfolder 和 /myfolder/mydata.txt |
Market* |
与具有以 Market 开头的名称的 JDBC 数据库中的表匹配,例如 Market_us 和 Market_fr |
Amazon Glue 解释 glob 排除模式,如下所示:
-
斜杠(
/)字符是将 Amazon S3 密钥分隔到文件夹层次结构中的分隔符。 -
星号 (
*) 字符与不跨越文件夹边界的名称组分的零个或多个字符匹配。 -
双星号 (
**) 与跨越文件夹或架构边界的零个或多个字符匹配。 -
问号 (
?) 字符恰好匹配名称组分的一个字符。 -
反斜杠 (
\) 字符用于对其他可以解释为特殊字符的字符进行转义。表达式\\与单个反斜杠匹配,\{与左大括号匹配。 -
方括号
[ ]创建一个与名称组分的单个字符 (来自一组字符) 匹配的方括号表达式。例如,[abc]与a、b或c匹配。连字符 (-) 可用于指定范围,因此[a-z]指定与从a到z(含) 的范围匹配。这些形式可以混合,因此 [abce-g] 与a、b、c、e、f或g匹配。如果方括号 ([) 后的字符是感叹号 (!),则括号表达式是否定的。例如,[!a-c]与a、b或c以外的任何字符匹配。在方括号表达式内,
*、?和\字符与自身匹配。如果连字符 (-) 是方括号内的第一个字符,或者如果它在您否定时是!之后的第一个字符,则它与自身匹配。 -
大括号 (
{ }) 将一组子模式 (如果组中的任何子模式匹配,则组匹配) 括起来。逗号 (,) 字符用于分隔子模式。不能对组进行嵌套。 -
在匹配操作中,文件名中的前导句点或点字符被视为正常字符。例如,
*排除与文件名.hidden匹配的模式。
例 Amazon S3 排除模式
将会根据包含路径计算每个排除模式。例如,假设您具有以下 Amazon S3 目录结构:
/mybucket/myfolder/
departments/
finance.json
market-us.json
market-emea.json
market-ap.json
employees/
hr.json
john.csv
jane.csv
juan.txt假定包含路径 s3://mybucket/myfolder/,下面是排除模式的一些示例结果:
| 排除模式 | 结果 |
|---|---|
departments/** |
排除 departments 下面的所有文件和文件夹,并包括 employees 文件夹及其文件 |
departments/market* |
排除 market-us.json、market-emea.json 和 market-ap.json |
**.csv |
排除名称以 .csv 结尾的 myfolder 下面的所有对象 |
employees/*.csv |
排除 employees 文件夹中的所有 .csv 文件 |
例 排除 Amazon S3 分区的子集
假设数据按天进行分区,以便一年中的每一天都在单独的 Amazon S3 分区中。对于 2015 年 1 月,有 31 个分区。现在,若要仅网络爬取 1 月的第一周内的数据,您必须排除除第 1 到第 7 天之外的所有分区:
2015/01/{[!0],0[8-9]}**, 2015/0[2-9]/**, 2015/1[0-2]/**
让我们来看一下此 glob 模式的几个部分。第一部分
2015/01/{[!0],0[8-9]}** 排除不以“0”开头的所有天,以及 2015 年 01 月中的第 08 和第 09 天。请注意,“**”用作日期数字模式的后缀,并穿越文件夹边界直到较低级别的文件夹。如果使用“*”,则不排除较低文件夹级别。
第二部分 2015/0[2-9]/** 排除 2015 年 02 月 09 月中的天。
第三部分 2015/1[0-2]/** 排除 2015 年 10、11 和 12 月中的天。
例 JDBC 排除模式
假设您使用以下架构结构网络爬取 JDBC 数据库:
MyDatabase/MySchema/
HR_us
HR_fr
Employees_Table
Finance
Market_US_Table
Market_EMEA_Table
Market_AP_Table假定包含路径 MyDatabase/MySchema/%,下面是排除模式的一些示例结果:
| 排除模式 | 结果 |
|---|---|
HR* |
排除名称以 HR 开头的表 |
Market_* |
排除名称以 Market_ 开头的表 |
**_Table |
排除名称以 _Table 结尾的所有表 |