如何防止 AWS Glue 爬网程序创建多个表?

2 分钟阅读
0

AWS Glue 爬网程序正在从我的源数据创建多个表,我想防止这种情况发生。

简短描述

在第一次 AWS Glue 爬网程序运行期间,爬网程序读取每个文件的前 1000 条记录或第一兆字节。它这样做是为了推断架构。爬网程序读取的数据量取决于文件格式和有效记录的可用性。

例如,如果输入的是 JSON 文件,则爬网程序会读取文件的前 1 MB 以推断架构。如果爬网程序读取文件前 1 MB 内的有效记录,则爬网程序会推断出架构。如果爬网程序在读取前 1 MB 后无法推断出架构,则它最多会读取 10 MB 的文件。它以 1 MB 为增量执行此操作。

对于 CSV 文件,爬网程序会读取前 1000 条记录或前 1 MB 数据,以先到者为准。对于 Parquet 文件,爬网程序直接从文件中推断架构。

爬网程序将比较从所有子文件夹和文件中推断出的架构,然后创建一个或多个表。

当您的源数据文件不使用这些相同的配置时,AWS Glue 爬网程序会创建多个表:

  • 格式(如 CSV、Parquet 或 JSON)
  • 压缩类型(如 SNAPPY、gzip 或 bzip2)
  • 架构
  • Amazon Simple Storage Service (Amazon S3) 分区架构

解决方案

查看爬网程序日志

检查爬网程序日志以识别导致爬网程序创建多个表的文件:

1.    打开 AWS Glue 控制台

2.    在导航窗格中,选择爬网程序

3.    选择要查看日志的爬网程序。

4.    选择日志链接可查看 Amazon CloudWatch 控制台上的日志。

5.    如果 AWS Glue 在爬网程序上次运行时创建了多个表,则日志会包含类似以下内容的条目:

[439d6bb5-ce7b-4fb7-9b4d-805346a37f88]
 INFO : Created table 
2_part_00000_24cab769_750d_4ef0_9663_0cc6228ac858_c000_snappy_parquet in
 database glue
[439d6bb5-ce7b-4fb7-9b4d-805346a37f88]
 INFO : Created table 
2_part_00000_3518b196_caf5_481f_ba4f_3e968cbbdd67_c000_snappy_parquet in
 database glue
[439d6bb5-ce7b-4fb7-9b4d-805346a37f88]
 INFO : Created table 
2_part_00000_6d2fffc2_a893_4531_89fa_72c6224bb2d6_c000_snappy_parquet in
 database glue

日志条目包括导致爬网程序创建多个表的文件的名称。

防止创建多个表

要防止创建多个表,请采取以下操作之一:

确认所有数据文件使用相同的架构、格式和压缩类型

在某些情况下,文件使用不同的架构。例如,架构 A 可能会说字段 X 是 INT 类型,而架构 B 说字段 X 是 BOOL 类型。在此用例中,采取以下操作之一:

  • 使用 from_options 函数运行 AWS Glue 提取、转换、加载(ETL)任务来读取异常值数据。然后,在您的资源中将异常值数据类型转换为正确的或最常见的数据类型。
  • 使用现有表 DDL 在 Amazon Athena 中手动创建表。然后,运行 AWS Glue 爬网程序来更新表元数据。使用爬网程序设置从表中继承架构

创建爬网程序时合并兼容的架构

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

您的数据在某些输入文件中可能有不同的架构,而在其他文件中可能有类似的架构。创建爬网程序时,可以组合兼容的架构。在配置爬网程序输出页面,S3 数据的分组行为(可选)下,选择为各 S3 路径创建单独架构。当您激活此设置且数据兼容时,爬网程序在评估路径中的 Amazon S3 对象时会忽略架构的相似性。

有关更多信息,请参阅如何为每个 Amazon S3 包含路径创建单个架构

检查您的输入文件是否有不同的 Amazon S3 路径

当 Amazon S3 前缀内的结构不一致时,爬网程序会将每个单独的路径假定为一个单独的表。然后,爬网程序创建了多个表。如果您的输入文件具有不同的 Amazon S3 结构或路径,则爬网程序会创建多个表。这是爬网程序的默认行为。

例如,爬网程序会抓取 Amazon S3 路径 s3://doc-example-bucket/doc-example-key/doc-example-table,其分区结构类似于以下结构:

  • s3://doc-example-bucket/doc-example-key/doc-example-table/dt=2020-08-20/doc-example-file1.csv
  • s3://doc-example-bucket/doc-example-key/doc-example-table/dt=2020-08-21/dox-example-file2.csv
  • s3://doc-example-bucket/doc-example-key/doc-example-table/dt=2020-08-22/doc-example-file3.csv

您将以下附加文件添加到前三个文件中:

  • s3://doc-example-bucket/doc-example-key/doc-example-table/dox-example-file4.csv
  • s3:// doc-example-bucket/doc-example-key/doc-example-table/doc-example-file5.csv

然后,爬网程序在另一次爬网程序运行中创建了五个单独的表。发生这种情况是因为文件夹分区结构不一致。

为避免出现此问题,请查看以下最佳实践:

  • 确保架构一致,无论是手动还是编程方式。在先前的示例中,可以删除不具有 dt=xxxx-xx-xx 分区的 Amazon S3 文件,也可以为文件 doc-example-file4.csvdoc-example-file5.csv 添加分区。
  • 使用排除模式排除任何不需要的文件或文件夹。

使用一致的标题

使用 CSV 数据时,请始终使用标题。如果您的某些文件具有标头而另一些没有,则爬网程序会创建多个表。


相关信息

管理 AWS Glue 中 ETL 输出的分区

设置爬网程序配置选项

AWS 官方
AWS 官方已更新 1 年前