【问题标题】:AWS Glue Crawler adding tables for every partition?AWS Glue Crawler 为每个分区添加表?
【发布时间】: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,好像是创建单表的一种方式,但是好像不起作用。

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


【解决方案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;
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2020-01-22
            • 1970-01-01
            • 2021-10-12
            • 2018-04-06
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-04-08
            相关资源
            最近更新 更多