问题描述
我需要找到S3存储桶中每个目录的大小。我知道可以通过AWS S3控制台中的get size选项轻松实现,但是我有很多目录要检查,手动检查每个目录的大小似乎很繁琐。我正在寻找一种有效的方法来通过雅典娜获得身材
我可以将S3内容导出到Athena表中,但是有什么方法可以通过查询来计算内容的大小?
解决方法
您可以在存储桶上启用S3 Inventory,它将以CSV,ORC或Parquet文件的形式每天或每周提供存储桶中所有对象的完整列表(根据您的配置,如果您想要在编辑器或Excel中查看文件,Parquet或ORC非常适合Athena。
按照Querying inventory with Amazon Athena中的说明使用Athena针对清单运行查询。
S3实际上没有“目录”的概念,因此确切地如何运行计算存储桶中每个目录大小的查询取决于您对目录的看法。常见的约定是将诸如a/b/c/d.txt
之类的键视为目录d.txt
,目录c
,目录b
中的文件a
,但这不是S3看到的样子–到S3为止,只有一个对象(文件),其键为a/b/c/d.txt
。我假设您说“目录”时正在考虑的就是这种约定。
您可以使用以下查询获取每个叶目录的大小(例如a/b/c
,但不能获取a/b
和a
)
SELECT
regexp_replace(key,'/[^/]+$') AS directory_prefix,SUM(size) AS directory_size
FROM my_inventory
GROUP BY 1
如果您希望每个目录的大小都与层次结构无关,那么它将变得更加复杂,因为可能存在任意深层次结构(不过受S3键的最大大小限制),并且编写处理查询并不容易接着就,随即。最好的选择是对第一个级别运行查询,对第二个级别运行另一个查询,依此类推,直到您知道存储桶中没有更深层次的结构。
关于为什么在S3控制台中似乎很容易计算目录大小的说明:控制台的作用是,它对您选择的前缀(“目录”)运行LIST
操作并求和增加找到的对象的大小。当前缀中只有几个对象时,这很快并且效果很好。当成千上万的时候,它变得非常缓慢。