爬网程序如何确定何时创建分区? - AWS Glue
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

爬网程序如何确定何时创建分区?

当 AWS Glue 爬网程序扫描 Amazon S3 并检测存储桶中的多个文件时,它会在文件夹结构中确定表的根,以及哪些文件夹是表的分区。表的名称基于 Amazon S3 前缀或文件夹名称。您提供一个包含路径,它指向要爬网的文件夹级别。当文件夹级别的大部分架构相似时,爬网程序会创建表的分区而不是单独的表。要影响爬网程序,以创建单独的表,可在定义爬网程序时将每个表的根文件夹添加为单独的数据存储。

例如,请考虑以下 Amazon S3 文件夹结构。


          多个级别的矩形表示 Amazon S3 中的文件夹层次结构。顶部矩形标记为“Sales”。标记为 year=2019 的矩形下面的。下两个矩形,它们标记为 month=Jan and month=February。 每个矩形在下方有两个矩形,它们标记有第 1 天和第 2 天。所有四个“天”(底部)矩形在下方包含两个或四个文件。所有矩形和文件都使用线条连接。

四个最低级别文件夹的路径如下所示:

S3://sales/year=2019/month=Jan/day=1 S3://sales/year=2019/month=Jan/day=2 S3://sales/year=2019/month=Feb/day=1 S3://sales/year=2019/month=Feb/day=2

假设爬网程序目标设置为 Sales,并且 day=n 文件夹中的所有文件具有相同的格式(例如,JSON,未加密),并且具有相同的或非常相似的架构。爬网程序将创建一个具有四个分区的单个表,分区键为 yearmonthday

在下一个示例中,请考虑以下 Amazon S3 结构:

s3://bucket01/folder1/table1/partition1/file.txt s3://bucket01/folder1/table1/partition2/file.txt s3://bucket01/folder1/table1/partition3/file.txt s3://bucket01/folder1/table2/partition4/file.txt s3://bucket01/folder1/table2/partition5/file.txt

如果 table1table2 下文件的架构相似,并且在爬网程序中使用 Include path (包含路径) s3://bucket01/folder1/ 定义单个数据存储,则爬网程序将创建一个具有两个分区键列的表。第一个分区键列包含 table1table2,第二个分区键列包含 partition1partition3(对于 table1 分区)以及 partition4partition5(对于 table2 分区)。要创建两个单独的表,可用两个数据存储来定义爬网程序。在本示例中,将第一个包含路径定义为 s3://bucket01/folder1/table1/,将第二个定义为 s3://bucket01/folder1/table2

注意

在 Amazon Athena 中,每个表对应一个 Amazon S3 前缀,所有对象都在其中。如果对象具有不同架构,Athena 则不会将同一前缀内的不同对象识别为不同的表。如果爬网程序从同一个 Amazon S3 前缀中创建多个表,则可能出现这种情况。这可能会导致 Athena 中的查询返回零个结果。为使 Athena 正确识别和查询表,请在创建爬网程序时,使 Amazon S3 文件夹结构中的每个不同的表架构具有单独的包含路径。有关更多信息,请参阅将 Athena 与 AWS Glue 一起使用时的最佳实践以及这篇 AWS 知识中心文章