我有一个非常基本的s3设置,我想使用Athena进行查询。数据全部存储在一个存储桶中,并分为年/月/日/小时文件夹。
|--data
| |--2018
| | |--01
| | | |--01
| | | | |--01
| | | | | |--file1.json
| | | | | |--file2.json
| | | | |--02
| | | | | |--file3.json
| | | | | |--file4.json
...
然后,我设置一个AWS Glue爬网程序来爬网{{1}}。所有文件中的架构都是相同的。我希望可以得到一个数据库表,并在年,月,日等上进行分区。
我得到的是成千上万张表。每个文件都有一个表,每个父分区也都有一个表。据我所知,为每个文件/文件夹创建了单独的表,而没有一个总体表,可以在较大的日期范围内进行查询。
我尽最大努力遵循了https://docs.aws.amazon.com/glue/latest/dg/crawler-configuration.html的说明,但无法弄清楚如何构造分区/扫描,以致于我不会得到如此庞大的,几乎毫无价值的数据转储。
答案 0 :(得分:0)
通常只有一条记录的文件会创建单独的表。我尝试了具有2条以上记录的文件,并且能够将所有文件归为一个表并具有各自的分区。
您的json文件看起来如何?
答案 1 :(得分:0)
Glue Crawler有很多不足之处。它有望解决很多情况,但实际上它所支持的功能有限。如果您的数据存储在目录中,并且未使用Hive样式的分区(例如year=2019/month=02/file.json
),则经常会造成混乱。当数据是由其他AWS产品(如Kinesis Firehose)生成的,看起来像您的数据时,尤其令人沮丧。
根据您拥有的数据量,我可能会先创建一个指向该结构根的未分区的Athena表来开始。只有当您的数据增长到超过数GB或成千上万个文件时,分区才变得重要。
您可以采用的另一种策略是添加Lambda函数,只要有新对象进入存储桶,该函数就会由S3通知触发。该函数可以查看键并找出它属于哪个分区,然后使用Glue API将该分区添加到表中。添加已经存在的分区将从API返回错误,但是只要您的函数捕获了该分区并忽略它,您就可以了。