AWS Glue 不检测分区并在目录中创建 1000 多个表

Posted

技术标签:

【中文标题】AWS Glue 不检测分区并在目录中创建 1000 多个表【英文标题】:AWS Glue does not detect partitions and creates 1000+ tables in catalog 【发布时间】:2018-06-18 08:45:18 【问题描述】:

我正在使用 AWS Glue 创建元数据表。

AWS Glue Crawler 数据存储路径:s3://bucket-name/

S3 中的 Bucket 结构是这样的

├── bucket-name        
│   ├── pt=2011-10-11-01     
│   │   ├── file1                    
|   |   ├── file2                                        
│   ├── pt=2011-10-11-02               
│   │   ├── file1          
│   ├── pt=2011-10-10-01           
│   │   ├── file1           
│   ├── pt=2011-10-11-10              
│   │   ├── file1  

                       

为此 AWS 爬虫创建 4 个表。

我的问题是为什么 aws 胶水爬虫没有检测到分区?

【问题讨论】:

【参考方案1】:

答案是:

Aws 粘合爬虫在合并架构之前,首先找到架构的相似性索引。如果相似度指数超过 70% 则合并,否则创建一个新表。

【讨论】:

是否有相关文档?我将不胜感激任何详细信息的链接。【参考方案2】:

尝试使用s3://bucket-name/<table_name>/pt=<date_time>/file 之类的表路径。 如果之后 Crawler 将每个分区视为单独的表,请尝试手动创建表并重新运行 Crawler 以带来分区。

【讨论】:

【参考方案3】:

需要爬取一个父文件夹下所有分区,否则爬虫会将每个分区视为单独的表。例如,像这样创建

s3://bucket/table/part=1
s3://bucket/table/part=2
s3://bucket/table/part=3

然后爬取 s3://bucket/table/

【讨论】:

【参考方案4】:

要强制 Glue 将多个架构合并在一起,请确保在创建爬虫时选中此选项 - 为每个 S3 路径创建一个架构。

Screenshot of crawler creation step, with this setting enabled

这是一个详细的解释 - 直接引用,来自 AWS 文档 (reference)

默认情况下,当爬虫为存储在 Amazon S3 中的数据定义表时,它会同时考虑数据兼容性和架构相似性。考虑的数据兼容性因素包括数据是否具有相同的格式(例如,JSON)、相同的压缩类型(例如,GZIP)、Amazon S3 路径的结构以及其他数据属性。架构相似度衡量不同 Amazon S3 对象的架构相似程度。

您可以将爬虫配置为将CompatibleSchemas 组合到一个公共表定义中(如果可能)。使用此选项,爬虫仍会考虑数据兼容性,但在评估指定包含路径中的 Amazon S3 对象时会忽略特定架构的相似性。

如果您在控制台上配置爬虫,要组合架构,请选择爬虫选项为每个 S3 路径创建单个架构。

【讨论】:

欢迎提供指向解决方案的链接,但最好在链接周围添加上下文并引用您要链接到的页面中最相关的部分,以防目标页面不可用。 @youssef - 感谢您对我第一次回答的反馈:)。请让我知道此编辑是否足够【参考方案5】:

为了让 AWS Glue 避免创建无关表,我需要做两件事。这是用 boto3 1.17.46 测试的。

首先,确保 S3 对象结构如下:

s3://mybucket/myprefix/mytable1/<nested_partition>/<name>.xyz
s3://mybucket/myprefix/mytable2/<nested_partition>/<name>.xyz
s3://mybucket/myprefix/mytable3/<nested_partition>/<name>.xyz

其次,如果使用boto3,使用参数创建爬虫:

targets = ["Path": f"s3://mybucket/myprefix/mytablei/" for i in (1, 2, 3)]
config = "Version": 1.0, "Grouping": "TableGroupingPolicy": "CombineCompatibleSchemas"

boto3.client("glue").create_crawler(Targets="S3Targets": targets, Configuration=json.dumps(config))
根据Targets,每个表的路径都作为一个列表提供给爬虫。 根据Configuration,每个提供的路径下的所有文件都应合并到一个架构中。

如果使用 boto3 以外的其他东西,则应直接提供类似的上述参数。

【讨论】:

以上是关于AWS Glue 不检测分区并在目录中创建 1000 多个表的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 AWS Glue Crawler 读取 PostgreSQL 表分区?

从 AWS Redshift 到 S3 的 AWS Glue ETL 作业失败

AWS Glue:SQL Server 多个分区数据库 ETL 到 Redshift

通过 AWS 上的 API 在胶表上添加分区?

使用 AWS Glue Scala 查询 Athena(添加分区)

如何修复 AWS Glue 代码以显示来自 AWS S3 的分区表的计数和架构