Amazon Glue 爬网程序如何检测 schema?

上次更新日期:2021 年 8 月 27 日

我正在运行 Amazon Glue 爬网程序。尽管 schema 看起来相似,但是 Amazon Glue 爬网程序仍创建多个表。我想知道我的爬网程序如何检测 schema。

解决方法

当您运行 Amazon Glue 爬网程序时,爬网程序会执行以下操作:

  1. 对数据进行分类
  2. 将数据分组到表或分区
  3. 将元数据写入 Amazon Glue 数据目录

查看以下内容以了解运行爬网程序时会发生什么以及爬网程序如何检测 schema。

定义爬网程序

定义 Amazon Glue 爬网程序时,您可以选择一个或多个自定义分类器来评估数据格式以推断 schema。当爬网程序运行时,列表中成功识别数据存储的第一个分类器将用于为表创建 schema。在定义爬网程序之前,先定义自定义分类器。爬网程序在运行时使用您定义的自定义分类器在数据存储中查找匹配项。与每个分类器的匹配会产生确定性。如果分类器在处理过程中返回了 certainty=1.0,那么爬网程序 100% 确定分类器可以创建正确的 schema。在这种情况下,爬网程序会停止调用其他分类器,然后使用与自定义分类器匹配的分类器创建一个表。

如果 Amazon Glue 找不到符合输入数据格式的自定义分类器,那么 Amazon Glue 将调用内置的分类器。如果格式匹配,内置分类器将返回 certainty=1.0;如果格式不匹配,则返回 certainty=0.0。如果没有分类器返回 certainty=1.0,则 Amazon Glue 将使用具有最高确定性的分类器的输出。如果没有分类器返回的确定性高于 0.0,则 Amazon Glue 将返回原定设置的分类字符串 UNKNOWN。有关 Amazon Glue 中内置分类器的当前列表以及它们的调用顺序,请参阅 Amazon Glue 中的内置分类器

爬网程序中的 schema 检测

在第一次运行爬网程序期间,爬网程序会读取前 1,000 条记录或每个文件的第一个兆字节来推断 schema。读取的数据量取决于文件格式和有效记录的可用性。例如,如果输入文件是 JSON 文件,则爬网程序会读取该文件的前 1 MB 来推断 schema。如果在文件的前 1 MB 内读取了有效记录,则爬网程序会推断 schema。如果爬网程序在读取前 1 MB 后无法推断 schema,则爬网程序最多读取 10 MB 的文件,一次增加 1 MB。对于 CSV 文件,爬网程序会读取前 100 条记录或前 1 MB 的数据,无论哪个先出现。对于 Parquet 文件,爬网程序直接从文件中推断 schema。爬网程序将比较从所有子文件夹和文件中推断出的 schema,然后创建一个或多个表。当爬网程序创建表时,它会考虑以下因素:

  • 用于检查数据的格式、压缩类型和包含路径是否相同的数据兼容性
  • 用于检查 Schema 在分区阈值和不同 Schema 数量方面相似程度的 Schema 相似性

要将 schema 视为类似,必须满足以下条件:

  • 分区阈值高于 0.7 (70%)。
  • 不同 schema(在此上下文中也称为“集群”)的最大数量不超过 5 个。

爬网程序在文件夹级别推断 schema 并比较所有文件夹之间的 schema。如果比较的 schema 匹配,也就是说,如果分区阈值高于 70%,则 schema 将表示为表的分区。如果不匹配,则爬网程序会为每个文件夹创建一个表,从而导致生成更多的表。

示例场景

示例 1:假设文件夹 DOC-EXAMPLE-FOLDER1 有 10 个文件,8 个带 schema SCH_A 的文件和 2 个带有 SCH_B 的文件。

假设具有 schema SHC_A 的文件类似于以下内容:

{ "id": 1, "first_name": "John", "last_name": "Doe"}
{ "id": 2, "first_name": "Li", "last_name": "Juan"}

假设具有 schema SCH_B 的文件类似于以下内容:

{"city":"Dublin","country":"Ireland"}
{"city":"Paris","country":"France"}

当爬网程序抓取 Amazon Simple Storage Service (Amazon S3) 路径 s3://DOC-EXAMPLE-FOLDER1 时,爬网程序会创建一个表。该表包括 schema SCH_A 和 SCH_B 的列。这是因为路径中 80% 的文件属于 SCH_A schema,20% 的文件属于 SCH_B schema。因此,分区阈值已满足。此外,不同 schema 的数量尚未超过集群数量,并且没有超过集群大小限制。

示例 2:假设文件夹 DOC-EXAMPLE-FOLDER2 有 10 个文件,7 个带 schema SCH_A 的文件和 3 个带有 SCH_B 的文件。

当爬网程序抓取 Amazon S3 路径 s3://DOC-EXAMPLE-FOLDER2 时,爬网程序会为每个文件创建一个表。这是因为 70% 的文件属于 schema SCH_A,30% 的文件属于 schema SCH_B。这意味着没有达到分区阈值。您可以在 Amazon CloudWatch 中查看爬网程序日志以获取有关创建表的信息。

爬网程序选项

  • 创建单个 schema:要将爬网程序配置为忽略 schema 相似性并仅创建一个 schema,请使用选项为每个 S3 路径创建单个 schema。有关更多信息,请参阅如何为各 Amazon S3 包含路径创建单独 schema。但是,如果爬网程序检测到数据不兼容,那么爬网程序仍会创建多个表。
  • 指定表位置:使用表级爬网程序选项,您可以告诉爬网程序表的位置以及如何创建分区。当您指定表级别值时,表将在该绝对级别上从 Amazon S3 存储桶创建。在控制台上配置爬网程序时,可以为表级爬网程序选项指定值。该值必须是一个正整数,该整数表示表位置(数据集中的绝对级别)。顶级文件夹的级别为 1。例如,对于路径 mydataset/a/b,如果级别设置为 3,则表将在 mydataset/a/b 的位置创建。有关详细信息,请参阅如何指定表位置

这篇文章对您有帮助吗?


您是否需要账单或技术支持?