

# 步骤 2：选择数据源和分类器
<a name="define-crawler-choose-data-sources"></a>

接下来，为爬网程序配置数据来源和分类器。

有关支持的数据来源的更多信息，请参阅[支持的可供爬取的数据来源](crawler-data-stores.md)。

**数据来源配置**  
为**您的数据是否已映射到 Amazon Glue 表？**选择相应的选项，选择“尚未”或“是”。默认情况下已选择“尚未”。  
爬网程序可以直接访问数据存储作为爬取的源，也可以使用数据目录中的现有表作为源。如果爬网程序使用现有目录表，它将爬取由这些目录表指定的数据存储。  
+ 还没有：选择一个或多个要爬取的数据源。一个爬网程序可以爬取多个不同类型的数据存储（Amazon S3、JDBC 等）。

  您一次只能配置一个数据存储。提供连接信息并包含路径和排除模式后，您可以选择添加另一个数据存储。
+ 是：从您的 Amazon Glue 数据目录中选择现有表。目录表指定要爬取的数据存储。爬网程序在单次运行中只能爬取目录表；它无法混用其他源类型。

  将目录表指定为源的常见原因是在您手动创建该表（因为您已经知道数据存储的结构）时，您希望爬网程序让表保持更新，包括添加新分区。有关其他原因的讨论，请参阅[使用爬网程序更新手动创建的数据目录表](tables-described.md#update-manual-tables)。

  当您指定现有表作为爬网程序源类型时，以下条件适用：
  + 数据库名称是可选的。
  + 仅允许指定 Amazon S3、Amazon DynamoDB 或 Delta Lake 数据存储的目录表。
  + 爬网程序运行时，不会创建新的目录表。根据需要更新现有表，包括添加新分区。
  + 将忽略在数据存储中找到的已删除对象；不删除目录表。而是由爬网程序写入日志消息。(`SchemaChangePolicy.DeleteBehavior=LOG`)
  + 默认情况下启用为每个 Amazon S3 路径创建单一架构的爬网程序配置选项，且不能禁用此选项。（`TableGroupingPolicy`=`CombineCompatibleSchemas`）有关更多信息，请参阅[为每条 Amazon S3 包含路径创建单个架构](crawler-grouping-policy.md)。
  + 您不能将目录表与任何其他源类型（例如 Amazon S3 或 Amazon DynamoDB）混用来作为源。
  
 要使用 Delta 表，请首先使用 Athena DDL 或 Amazon Glue API 创建一个 Delta 表。  
 使用 Athena 时，请将位置设置为您的 Amazon S3 文件夹，将表类型设置为“DELTA”。  

```
CREATE EXTERNAL TABLE database_name.table_name
LOCATION 's3://bucket/folder/'
TBLPROPERTIES ('table_type' = 'DELTA')
```
 使用 Amazon Glue API 时，请在表参数映射中指定表类型。表参数需要包含以下键/值对。有关如何创建表的更多信息，请参阅[有关 create\_table 的 Boto3 文档](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/glue/client/create_table.html)。  

```
{
    "table_type":"delta"
}
```

**数据来源**  
选择或添加要由爬网程序扫描的数据源列表。  
 （可选）如果选择 JDBC 作为数据来源，则在指定存储驱动程序信息的连接访问权限时，可以使用自己的 JDBC 驱动程序。

**包含路径**  
 在评估要在爬取中包含或排除的内容时，爬网程序首先评估所需的包含路径。对于 Amazon S3、MongoDB、MongoDB Atlas、Amazon DocumentDB（与 MongoDB 兼容）和关系数据存储，您必须指定包含路径。    
对于 Amazon S3 数据存储  
选择是在此账户还是其他账户中指定路径，然后浏览以选择 Amazon S3 路径。  
对于 Amazon S3 数据存储，包含路径语法为 `bucket-name/folder-name/file-name.ext`。要网络爬取存储桶中的所有对象，只需在包含路径中指定存储桶名称。排除模式与包含路径是相对的  
对于 Delta Lake 数据存储  
将一个或多个指向 Delta 表的 Amazon S3 路径，格式为 s3://{{bucket}}/{{prefix}}/{{object}}。  
适用于 Iceberg 或 Hudi 数据存储  
指定一个或多个包含 Iceberg 或 Hudi 表元数据为 s3://{{bucket}}/{{prefix}} 的文件夹的 Amazon S3 路径。  
对于 Iceberg 和 Hudi 数据存储，Iceberg/Hudi 文件夹可能位于根文件夹的子文件夹中。爬网程序将扫描路径下的所有文件夹，寻找 Hudi 文件夹。  
对于 JDBC 数据存储  
输入 {{<database>}}/{{<schema>}}/{{<table>}} 或 {{<database>}}/{{<table>}}，具体取决于数据库产品。Oracle Database 和 MySQL 不支持路径中的架构。您可以用百分比 (%) 字符替换 {{<schema>}} 或 {{<table>}}。例如，对于系统标识符 (SID) 为 `orcl` 的 Oracle 数据库，输入 `orcl/%` 以导入连接中指定的用户有权访问的所有表。  
此字段区分大小写。
 如果您选择引入自己的 JDBC 驱动程序版本，则 Amazon Glue 爬网程序将消耗 Amazon Glue 作业 和 Amazon S3 存储桶中的资源，以确保您提供的驱动程序在您的环境中运行。额外的资源使用量将反映在您的账户中。驱动程序仅限于[添加 Amazon Glue 连接](https://docs.amazonaws.cn/glue/latest/dg/console-connections.html)中描述的属性。  
对于 MongoDB、MongoDB Atlas 或 Amazon DocumentDB 数据存储  
对于 MongoDB、MongoDB Atlas 和 Amazon DocumentDB（与 MongoDB 兼容），语法为 `database/collection`。
对于 JDBC 数据存储，语法为 `database-name/schema-name/table-name` 或 `database-name/table-name`。语法取决于数据库引擎是否支持数据库中的架构。例如，对于 MySQL 或 Oracle 等数据库引擎，请不要在包含路径中指定 `schema-name`。您可以用百分号 (`%`) 取代包含路径中的架构或表，以表示数据库中的所有架构或所有表。您不能用百分号 (`%`) 取代包含路径中的数据库。

**最大遍历深度（仅适用于 Iceberg 或 Hudi 数据存储）**  
定义爬网程序可以遍历的最大 Amazon S3 路径深度，以发现 Amazon S3 路径中的 Iceberg 或 Hudi 元数据文件夹。此参数的目的是限制爬网程序的运行时间。默认值为 10；最大值为 20。

**排除模式**  
您可以使用这些模式从爬取中排除某些文件或表。排除路径与包含路径是相对的。例如，要排除 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` 模式。      
[See the AWS documentation website for more details](http://docs.amazonaws.cn/glue/latest/dg/define-crawler-choose-data-sources.html)
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` 匹配的模式。

**Example 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/`，下面是排除模式的一些示例结果：    
[See the AWS documentation website for more details](http://docs.amazonaws.cn/glue/latest/dg/define-crawler-choose-data-sources.html)

**Example 排除 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 月中的天。

**Example JDBC 排除模式**  
假设您使用以下架构结构网络爬取 JDBC 数据库：  

```
MyDatabase/MySchema/
   HR_us
   HR_fr
   Employees_Table
   Finance
   Market_US_Table
   Market_EMEA_Table
   Market_AP_Table
```
假定包含路径 `MyDatabase/MySchema/%`，下面是排除模式的一些示例结果：    
[See the AWS documentation website for more details](http://docs.amazonaws.cn/glue/latest/dg/define-crawler-choose-data-sources.html)

**其他爬网程序源参数**  
每种源类型都需要一组不同的附加参数。

**Connection**  
选择或添加 Amazon Glue 连接。有关连接的信息，请参阅 [连接到数据](glue-connections.md)。

**其他元数据 — 可选（适用于 JDBC 数据存储）**  
选择爬网程序要爬取的其他元数据属性。  
+ 注释：爬取相关的表级和列级注释。
+ 原始类型：在其他元数据中保留表列的原始数据类型。作为默认行为，爬网程序将原始数据类型转换为与 Hive 兼容的类型。

**JDBC 驱动程序类名 - 可选（对于 JDBC 数据存储）**  
 键入自定义 JDBC 驱动程序类名，以便爬网程序连接到数据来源：  
+ Postgres：org.postgresql.Driver
+ MySQL：com.mysql.jdbc.Driver, com.mysql.cj.jdbc.Driver
+ Redshift：com.amazon.redshift.jdbc.Driver, com.amazon.redshift.jdbc42.Driver
+ Oracle：oracle.jdbc.driver.OracleDriver
+ SQL Server：com.microsoft.sqlserver.jdbc.SQLServerDriver

**JDBC 驱动程序 S3 路径 - 可选（对于 JDBC 数据存储）**  
选择 `.jar` 文件的现有 Amazon S3 路径。使用自定义 JDBC 驱动程序让爬网程序连接到数据来源时，`.jar` 文件将存储在这里。

**启用数据采样（仅适用于 Amazon DynamoDB、MongoDB、MongoDB Atlas 和 Amazon DocumentDB 数据存储）**  
选择是否仅对数据样本进行爬网。如果未选择该选项，则对整个表进行爬网。当表不是高吞吐量表时，扫描所有记录会花费很长时间。

**创建用于查询的表（仅适用于 Delta Lake 数据存储）**  
选择要如何创建 Delta Lake 表：  
+ 创建原生表：允许与支持直接查询 Delta 事务日志的查询引擎集成。
+ 创建符号链接表：根据指定的配置参数，使用由由分区键分区的清单文件创建符号链接清单文件夹。

**扫描速率 — 可选（仅适用于 DynamoDB 数据存储）**  
指定爬网程序使用的 DynamoDB 表读取容量单位的百分比。读取容量单位是一个由 DynamoDB 定义的术语，它是一个数值，用作每秒可对表执行的读取次数的速率限制器。请输入介于 0.1 和 1.5 之间的值。如果未指定，则该值默认为 0.5（对于预置的表）和配置的最大容量的 1/4（对于按需表）。请注意，只应将预置容量模式与 Amazon Glue 网络爬取程序结合使用。  
对于 DynamoDB 数据存储，请设置预置容量模式来处理表的读写。Amazon Glue 网络爬取程序不应与按需容量模式结合使用。

**网络连接：可选（适用于 Amazon S3、Delta、Iceberg、Hudi 和 Catalog 目标数据存储）**  
可以包括一个用于此 Amazon S3 目标的网络连接。请注意，每个爬网程序仅限于一个网络连接，因此任何其他 Amazon S3 目标也将使用相同的连接（如果留空，则不使用任何连接）。  
有关连接的信息，请参阅 [连接到数据](glue-connections.md)。

**仅对文件子集和样本大小进行采样（仅适用于 Amazon S3 数据存储）**  
指定爬取数据集中的示例文件时要网络爬取的每个叶文件夹中的文件数。启用此功能后，爬网程序会随机选择每个叶文件夹中的一些文件进行网络爬取，而不是网络爬取此数据集中的所有文件。  
采样爬网程序最适合于先前了解其数据格式并知道其文件夹中的架构不会更改的客户。启用此功能将显著减少爬网程序运行时间。  
有效值是介于 1 到 249 之间的整数。如果未指定，则对所有文件进行爬取。

**随后爬网程序运行**  
此字段是影响所有 Amazon S3 数据源的全局字段。  
+ 爬取所有子文件夹：在后续每次爬取时再次爬取所有文件夹。
+ 仅爬取新子文件夹：仅爬取上次爬取后添加的 Amazon S3 文件夹。如果架构兼容，则新分区将添加到现有表中。有关更多信息，请参阅 [计划用于添加新分区的增量爬取](incremental-crawls.md)。
+ 基于事件爬取：依靠 Amazon S3 事件控制要爬取的文件夹。有关更多信息，请参阅 [使用 Amazon S3 事件通知加速网络爬取](crawler-s3-event-notifications.md)。

**自定义分类器 — 可选**  
您可以先定义自定义分类器，然后再定义爬网程序。分类器检查爬网程序是否可以处理给定文件的格式。如果可以处理，分类器将以与该数据格式匹配的 `StructType` 对象的形式创建一个模式。  
有关更多信息，请参阅 [定义和管理分类器](add-classifier.md)。