当我运行 AWS Glue 爬网程序时,爬网程序会使用相似的架构创建多个表。我想知道爬网程序如何检测架构。
解决方法
爬网程序中的架构检测
在爬网程序首次运行期间,爬网程序会读取前 1,000 条记录或每个文件的前一兆字节来推断架构。爬网程序读取的数据量取决于文件格式和有效记录的可用性。例如,如果输入文件是 JSON 文件,则爬网程序会读取该文件的前 1MB 来推断架构。
如果爬网程序在文件的前 1MB 内读取到有效记录,则爬网程序会推断出架构。如果爬网程序在读取 1MB 之后仍无法推断出架构,则会继续以 1MB 为增量读取最多 10MB 的文件。
对于 CSV 文件,爬网程序会读取前 1000 条记录或前 1MB 的数据,以先到者为准。对于 Parquet 文件,爬网程序直接从文件中推断架构。爬网程序会将从所有子文件夹和文件中推断出的架构进行比较,然后创建一个或多个表。
当爬网程序创建表时,爬网程序会检查以下因素:
- 检查数据是否具有相同的格式、压缩类型和包含路径
- 架构的分区阈值有多相似和不同架构的数量
要让爬网程序判定架构相似,必须满足以下条件:
- 分区阈值高于 0.7 (70%)。
- 不同架构(在此上下文中也称为“集群”)的最大数量不超过五。
爬网程序在文件夹级别推断架构,并会比较所有文件夹的架构。如果比较的架构匹配的分区阈值高于 70%,则爬网程序会将这些架构表示为表的分区。如果不匹配,则爬网程序会为每个文件夹创建一个表,这会导致表数量增多。
示例场景
示例 1
在以下示例中,文件夹 DOC-EXAMPLE-FOLDER1 有 10 个文件,其中八个文件的架构为 SCH_A,两个文件的架构为 SCH_B。
文件与以下示例类似:
SHC_A:
{ "id": 1, "first_name": "John", "last_name": "Doe"}{ "id": 2, "first_name": "Li", "last_name": "Juan"}
SCH_B:
{"city":"Dublin","country":"Ireland"}{"city":
"Paris","country":"France"}
当爬网程序爬取 Amazon Simple Storage Service (Amazon S3) 路径 s3://DOC-EXAMPLE-FOLDER1 时,爬网程序会创建一个表。该表包含架构 SCH_A 和 SCH_B 的列。这是因为路径中 80% 的文件属于 SCH_A 架构,而 20% 的文件属于 SCH_B 架构。因此,该架构符合分区阈值。此外,不同架构的数量不超过集群的数量,架构也不会超过集群大小限制。
示例 2
在以下示例中,文件夹 DOC-EXAMPLE-FOLDER2 有 10 个文件,其中七个文件的架构为 SCH_A,三个文件的架构为 SCH_B。
当爬网程序爬取 Amazon S3 路径 s3://DOC-EXAMPLE-FOLDER2 时,爬网程序会为每个文件创建一个表。这是因为 70% 的文件属于架构 SCH_A,而 30% 的文件属于架构 SCH_B。因此,该架构未达到分区阈值。
注意: 要获取有关这些表的信息,请查看 Amazon CloudWatch 中的爬网程序日志。
爬网程序选项
在自定义爬网程序行为时,您可以选择以下选项之一:
- 使用 Create a single schema for each S3 path(为每个 S3 路径创建单一架构)选项将爬网程序配置为忽略架构相似度并创建单一架构。
注意: 如果爬网程序检测到数据不兼容,则爬网程序仍会创建多个表。
- 使用表级爬网程序选项来指定表的位置以及您希望爬网程序创建分区的方式。
相关信息
Using crawlers to populate the Data Catalog(使用爬网程序填充 Data Catalog)
Customizing crawler behavior(自定义爬网程序行为)
Defining and managing classifiers(定义和管理分类器)