AWS Glue 爬网程序创建分区表和文件表



我有一个非常基本的 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 按照说明进行操作,但无法弄清楚如何构建我的分区/扫描,这样我就不会得到这个巨大的、几乎毫无价值的数据转储。

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

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

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

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

您的 json 文件是什么样的?

最新更新