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.csv 和 doc-example-file5.csv 添加分区。
- 使用排除模式排除任何不需要的文件或文件夹。
使用一致的标题
使用 CSV 数据时,请始终使用标题。如果您的某些文件具有标头而另一些没有,则爬网程序会创建多个表。
相关信息
管理 AWS Glue 中 ETL 输出的分区
设置爬网程序配置选项