用于有效Athena查询的S3分区(文件大小)

时间:2019-01-16 03:18:07

标签: amazon-s3 amazon-athena presto

我有一条管道将每日记录加载到S3中。然后,我利用AWS Glue Crawler创建分区以简化AWS Athena查询。但是,与其他数据相比,存在很大的分区数据。

S3文件夹/文件显示如下:

s3.ObjectSummary(bucket_name='bucket', key='database/table/2019/00/00/2019-00-00.parquet.gzip')   7.8 MB

s3.ObjectSummary(bucket_name='bucket', key='database/table/2019/01/11/2019-01-11.parquet.gzip')  29.8 KB
s3.ObjectSummary(bucket_name='bucket', key='database/table/2019/01/12/2019-01-12.parquet.gzip')  28.5 KB
s3.ObjectSummary(bucket_name='bucket', key='database/table/2019/01/13/2019-01-13.parquet.gzip')  29.0 KB
s3.ObjectSummary(bucket_name='bucket', key='database/table/2019/01/14/2019-01-14.parquet.gzip')  43.3 KB
s3.ObjectSummary(bucket_name='bucket', key='database/table/2019/01/15/2019-01-15.parquet.gzip') 139.9 KB

,文件大小显示在每一行的末尾。请注意,2019-00-00.parquet.gzip包含2019-01-11之前的所有记录,因此,它的大小很大。我读过this,它说“如果您的数据严重偏向一个分区值,并且大多数查询都使用该值,那么开销可能会消除最初的好处。” < / p>

因此,我想知道应该将2019-00-00.parquet.gzip拆分为具有不同分区的较小的镶木地板文件。例如,

key='database/table/2019/00/00/2019-00-01.parquet.gzip',
key='database/table/2019/00/00/2019-00-02.parquet.gzip',
key='database/table/2019/00/00/2019-00-03.parquet.gzip', ......

但是,我认为此分区不是那么有用,因为它不能反映何时存储旧记录。我对所有解决方法都开放。谢谢。

1 个答案:

答案 0 :(得分:0)

如果数据的总大小总共少于几GB,则根本不需要对表进行分区。对小型数据集进行分区对性能的损害远不止于此。将所有文件保留在同一目录中,未分区表中的深层目录结构也会影响性能。

对于小型数据集,只要文件不太多(最好将其保持在一百以下),最好不进行分区。如果由于某种原因您必须拥有许多小文件,则可以从分区中受益,但在这种情况下可以对其进行基准测试。

当数据大小较小时(例如您的情况),在S3上查找文件,打开并读取文件的开销将比实际处理它们要高。

如果您的数据增长到数百兆字节,则可以开始考虑分区,并寻求一种分区方案,其中分区的大小约为100兆字节至1 GB。如果您的数据中存在时间成分,那么似乎是最好的分割方法。首先查看使用年作为分区键,然后查看月,依此类推。当然,数据的确切分区方式取决于查询模式。