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

时间:2018-01-22 00:10:27

标签: amazon-web-services parquet aws-glue

我在这种形式的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为每个数据,更多数据等创建一个表。它根据子项的路径名为每个表创建分区。

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

我认为没有地方可以设置或阻止这种情况发生......有没有人就防止创建这些不必要的表的最佳方法提出建议?

6 个答案:

答案 0 :(得分:3)

使用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;

答案 1 :(得分:1)

Adding to the excludes

  • **_SUCCESS
  • **crc

worked for me (see aws page glue/add-crawler). Double stars match the files at all folder (ie partition) depths. I had an _SUCCESS living a few levels up.

Make sure you set up logging for glue, which quickly points out permission errors etc.

答案 2 :(得分:0)

我遇到了同样的问题。 我将*crc*作为排除模式添加到AWS Glue抓取工具中并且工作正常。 或者,如果您抓取整个目录,请添加*/*crc*

答案 3 :(得分:0)

检查内部是否有空文件夹。当spark将数据写入S3时,有时_temporary文件夹不会被删除,这将使Glue搜寻器为每个分区创建表。

答案 4 :(得分:0)

每种表/文件类型都需要有单独的搜寻器。因此,请创建一个查看s3://bucket/somedata/的爬虫和另一个查看s3://bucket/moredata/的爬虫。

答案 5 :(得分:0)

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

我有一个像这样的数据结构:

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

因此,当我启动AWS Glue Crawler而不是更新表时,此管道正在为每个日期创建一个表。深入研究问题后,我发现有人在json文件中添加了一个列作为错误,而不是idID。由于我的数据是拼凑而成的,因此管道可以很好地存储数据并在EMR中进行检索。但是Glue崩溃很糟糕,因为Glue将所有内容都转换为小写,这也许就是它崩溃的原因。删除大写的色谱柱胶水开始起作用。