【问题标题】:AWS Glue Crawler Creates Partition and File TablesAWS Glue Crawler 创建分区和文件表
【发布时间】:2018-06-29 17:47:01
【问题描述】:

我有一个非常基本的 s3 设置,我想针对使用 Athena 进行查询。数据全部存储在一个桶中,组织成年/月/日/小时文件夹。

|--data
|   |--2018
|   |   |--01
|   |   |   |--01
|   |   |   |   |--01
|   |   |   |   |   |--file1.json
|   |   |   |   |   |--file2.json
|   |   |   |   |--02
|   |   |   |   |   |--file3.json
|   |   |   |   |   |--file4.json
...

然后我设置了一个 AWS Glue 爬虫来爬取 s3://bucket/data。所有文件中的架构都是相同的。我希望我会得到一个数据库表,分区是年、月、日等。

我得到的是成千上万张桌子。每个文件都有一个表,每个父分区也有一个表。据我所知,为每个文件/文件夹创建了单独的表,没有一个可以在较大日期范围内查询的总体表。

我尽我所能遵循了https://docs.aws.amazon.com/glue/latest/dg/crawler-configuration.html 的说明,但无法弄清楚如何构建我的分区/扫描,这样我就不会得到这个巨大的、几乎毫无价值的数据转储。

【问题讨论】:

  • 您是否尝试将文件放在s单个文件夹中而不进行分区并对其进行爬取?您是否尝试将分区命名为year=2018/month=01/day=01?你的 json 文件是什么样子的?
  • 我的 json 非常简单 {"x":"text","y":"text","z":"text"}。我没有尝试命名分区,这会减少实际创建的表/分区数量吗?你能像配置爬虫时写的那样命名分区内联吗?不,我的数据已经作为实时数据管道的输出存在,​​我没有重新组织。文件夹结构是经过深思熟虑的,我不会乱用它。
  • 爬虫无法内联分区。命名 '=' 只是使用分区更方便的方法,因为它们将在表中正确命名,而不是 'partition_0'、'partition_1' 等。我不确定这是否会影响爬虫虽然。您的文件看起来不错,当文件包含 json 对象数组时我遇到了问题,并且通过添加自定义分类器修复了它。

标签: amazon-web-services amazon-s3 amazon-athena aws-glue


【解决方案1】:

Glue Crawler 有很多不足之处。它承诺可以解决很多情况,但它实际支持的功能确实有限。如果您的数据存储在目录中并且不使用 Hive 样式的分区(例如year=2019/month=02/file.json),它往往会搞砸。当数据由其他 AWS 产品(例如 Kinesis Firehose)生成时,尤其令人沮丧,看起来您的数据可能就是这样。

根据您拥有的数据量,我可能首先创建一个指向结构根的未分区 Athena 表。只有当您的数据增长到超过数 GB 或数千个文件时,分区才会变得重要。

您可以采用的另一种策略是添加一个 Lambda 函数,只要有新对象进入您的存储桶,该函数就会由 S3 通知触发。该函数可以查看键并确定它属于哪个分区,并使用 Glue API 将该分区添加到表中。添加一个已经存在的分区会从 API 返回一个错误,但只要你的函数捕获它并忽略它就可以了。

【讨论】:

    【解决方案2】:

    大多数时候只有一条记录的文件会创建单独的表。我尝试了超过 2 条记录的文件,并且能够将所有内容分组到具有相应分区的一张表下。

    你的 json 文件是什么样子的?

    【讨论】:

    • 你是对的,看起来文件、文件夹、子文件夹等都创建了自己的表。我试图避免这种情况,或者至少隐藏它,因为为一个月的数据创建 20,000 个表是没有帮助的,尤其是考虑到 Athena 中有限的“查找表”功能。
    • 你能解决这个问题吗?我也有同样的问题。
    猜你喜欢
    • 2020-01-22
    • 2018-06-30
    • 1970-01-01
    • 2018-04-06
    • 2020-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多