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 文件中添加了一个列作为错误,而不是 id
是 ID
。因为我的数据是镶木地板,所以管道可以很好地存储数据并在 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 创建的表中返回零记录