我有一条管道将每日记录加载到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', ......
但是,我认为此分区不是那么有用,因为它不能反映何时存储旧记录。我对所有解决方法都开放。谢谢。
答案 0 :(得分:0)
如果数据的总大小总共少于几GB,则根本不需要对表进行分区。对小型数据集进行分区对性能的损害远不止于此。将所有文件保留在同一目录中,未分区表中的深层目录结构也会影响性能。
对于小型数据集,只要文件不太多(最好将其保持在一百以下),最好不进行分区。如果由于某种原因您必须拥有许多小文件,则可以从分区中受益,但在这种情况下可以对其进行基准测试。
当数据大小较小时(例如您的情况),在S3上查找文件,打开并读取文件的开销将比实际处理它们要高。
如果您的数据增长到数百兆字节,则可以开始考虑分区,并寻求一种分区方案,其中分区的大小约为100兆字节至1 GB。如果您的数据中存在时间成分,那么似乎是最好的分割方法。首先查看使用年作为分区键,然后查看月,依此类推。当然,数据的确切分区方式取决于查询模式。