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

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

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

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

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


          多个级别的矩形表示 Amazon S3 中的文件夹层次结构。顶部矩形标记为“Sales (销售额)”。下面的矩形标记为“year=2019 (年份=2019)”。下面的两个矩形标记为“month=Jan (月份=1 月)”和“month=Feb (月份=2 月)”。每个矩形下面都有两个矩形,标记为“day=1 (天=1)”和“day=2 (天=2)”。所有四个“day (天)”(底部)矩形下面都有两个或四个文件。所有矩形和文件都用线连接。

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

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 下的文件架构相似,并且在爬网程序中通过包含路径 s3://bucket01/folder1/ 定义了单个数据存储,爬网程序将创建一个具有两个分区键列的表。第一个分区键列包含 table1table2,第二个分区键列包含 table1 分区的 partition1partition3 以及 table2 分区的 partition4partition5。要创建两个单独的表,可用两个数据存储来定义爬网程序。在本示例中,将第一个包含路径定义为 s3://bucket01/folder1/table1/,将第二个定义为 s3://bucket01/folder1/table2

注意

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