我在这种形式的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执行上述行为,但是也为数据的每个分区创建一个单独的表,导致数百个无关表(以及每个数据添加的更多无关表+新爬网)。
我认为没有地方可以设置或阻止这种情况发生......有没有人就防止创建这些不必要的表的最佳方法提出建议?
答案 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文件中添加了一个列作为错误,而不是id
是ID
。由于我的数据是拼凑而成的,因此管道可以很好地存储数据并在EMR中进行检索。但是Glue崩溃很糟糕,因为Glue将所有内容都转换为小写,这也许就是它崩溃的原因。删除大写的色谱柱胶水开始起作用。