AWS Glue Crawler 为每个分区添加表?

Posted

技术标签:

【中文标题】AWS Glue Crawler 为每个分区添加表?【英文标题】:AWS Glue Crawler adding tables for every partition? 【发布时间】:2018-06-30 13:58:56 【问题描述】:

我在 S3 存储桶中有几千个文件,格式如下:

├── bucket
│   ├── somedata
│   │   ├── year=2016
│   │   ├── year=2017
│   │   │   ├── month=11
│   │   |   │   ├── sometype-2017-11-01.parquet
│   |   |   |   ├── sometype-2017-11-02.parquet
│   |   |   |   ├── ...
│   │   │   ├── month=12
│   │   |   │   ├── sometype-2017-12-01.parquet
│   |   |   |   ├── sometype-2017-12-02.parquet
│   |   |   |   ├── ...
│   │   ├── year=2018
│   │   │   ├── month=01
│   │   |   │   ├── sometype-2018-01-01.parquet
│   |   |   |   ├── sometype-2018-01-02.parquet
│   |   |   |   ├── ...
│   ├── moredata
│   │   ├── year=2017
│   │   │   ├── month=11
│   │   |   │   ├── moretype-2017-11-01.parquet
│   |   |   |   ├── moretype-2017-11-02.parquet
│   |   |   |   ├── ...
│   │   ├── year=...

预期行为: AWS Glue Crawler 为 somedata、moredata 等中的每一个创建一个表。它根据孩子的路径名为每个表创建分区。

实际行为: AWS Glue Crawler 执行上述行为,但 ALSO 也会为数据的每个分区创建一个单独的表,从而产生数百个无关表(以及每个数据添加的更多无关表 + 新爬网)。

我认为没有地方可以设置某些东西或以其他方式防止这种情况发生...有没有人建议最好的方法来防止创建这些不必要的表?

【问题讨论】:

我遇到了同样的问题:我需要一张桌子,但我得到了数百张。爬虫定义中有一个checkbox,好像是创建单表的一种方式,但是好像不起作用。 【参考方案1】:

我遇到了同样的问题。 我将 *crc* 作为排除模式添加到 AWS Glue 爬虫中,它起作用了。 或者,如果您抓取整个目录,请添加 */*crc*

【讨论】:

【参考方案2】:

添加到排除项

**_SUCCESS **crc

为我工作(参见 aws 页面 glue/add-crawler)。双星匹配所有文件夹(即分区)深度的文件。我有一个 _SUCCESS 生活在几个级别。

确保您为粘连设置了日志记录,它可以快速指出权限错误等。

【讨论】:

【参考方案3】:

检查里面是否有空文件夹。 spark写入S3时,有时_temporary文件夹没有被删除,这会使Glue爬虫为每个分区创建表。

【讨论】:

如何防止创建 _temporary 文件夹【参考方案4】:

您需要为每个表/文件类型设置单独的爬虫。因此,创建一个查看s3://bucket/somedata/ 的爬虫和一个查看s3://bucket/moredata/ 的第二个爬虫。

【讨论】:

【参考方案5】:

所以,我的情况有点不同,我的行为也一样。

我得到了这样的数据结构:

├── bucket
│   ├── somedata
│   │   ├── event_date=2016-01-01
│   │   ├── event_date=2016-01-02

因此,当我启动 AWS Glue Crawler 而不是更新表时,此管道会在每个日期创建一个表。在深入研究问题后,我发现有人在 json 文件中添加了一个列作为错误,而不是 idID。因为我的数据是镶木地板,所以管道可以很好地存储数据并在 EMR 中检索。但是 Glue 崩溃得很糟糕,因为 Glue 将所有内容都转换为小写,这可能就是它崩溃的原因。去除大写的列胶开始像魅力一样工作。

【讨论】:

【参考方案6】:

使用 Create a Single Schema for Each Amazon S3 Include Path 选项避免 AWS Glue Crawler 添加所有这些额外的表。

我遇到了这个问题,最终得到了大约 7k 个表 ? 所以编写了以下脚本来删除它们。它需要jq。

#!/bin/sh
aws glue get-tables --region <YOUR AWS REGION> --database-name <YOUR AWS GLUE DATABASE> | jq '.TableList[] | .Name' | grep <A PATTERN THAT MATCHES YOUR TABLENAMEs> > /tmp/table-names.json 
cd /tmp
mkdir table-names
cd table-names
split -l 50 ../table-names.json 
for f in `ls`; cat $f | tr '\r\n' ' ' | xargs aws glue batch-delete-table --region <YOUR AWS REGION> --database-name <YOUR AWS GLUE DATABASE> --tables-to-delete;

【讨论】:

以上是关于AWS Glue Crawler 为每个分区添加表?的主要内容,如果未能解决你的问题,请参考以下文章

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

AWS Glue Crawler 将 json 文件分类为 UNKNOWN

AWS Athena 从 S3 的 GLUE Crawler 输入 csv 创建的表中返回零记录

AWS Glue - GlueContext:从 S3 读取分区数据,将分区添加为 DynamicFrame 的列

AWS Glue Crawler无法提取CSV标头

使用CloudFormation上的JdbcTargets指定Glue :: Crawler