排序对parquet 文件大小的影响

背景

公司 hive数仓全面迁移到 iceberg后,发现存储空间比 hive 要大,并且文件格式都是 parquet

分析

iceberg存储空间比 hive 表大,最主要的原因是因为压缩算法不一样,然后也发现 iceberg 的 z-order 对存储空间有显著的降低

测试

数据大小 场景 序号
784G 不压缩,不排序 0
613G 不压缩,全局排序 1
157G zstd压缩,不排序 2
149G zstd压缩,局部排序( sort by ) 3
34G zstd压缩,全局排序 4
35G 针对上一个测试(34G 那个),应用 iceberg 的 bin pack 5
38G 针对上一个测试(34G 那个),应用 iceberg 的 z-order 6

结论

  1. 通过 0 和 1 对比以及Parquet 文件是如何编写的——行组、页面、所需内存和刷新操作
    我们可以知道排序,对于存储的影响还是挺大的,大约可以节省 171G,22%的存储空间
  2. 通过 0 和 2 对比,可以知道 压缩 对于存储空间的节省是立竿见影的,大约可以节省 627G,80%的存储空间
  3. 通过 2,3,4 对比,可以知道全局排序对于节省存储空间也是立竿见影的,大约可以节省 123G,78%

进一步探究

  1. 为什么压缩可以减少存储空间
    压缩可以节省空间,因为它可以通过减少文件中的冗余信息来缩小文件的大小。在压缩文件时,压缩算法会查找文件中的重复数据,并使用更简短的代码来代替这些重复数据。这样,文件中的数据量就会减少,从而减小文件的大小。

  2. 为什么排序可以减少存储空间
    因为排序可以将相似的值放在一起,从而提供压缩效率( 因为压缩算法通常使用重复数据的概念来压缩数据,可以参考 霍夫曼编码 )
    排序可以减少字典编码的大小,因为它可以使相似的值具有相同的前缀,从而使字典编码可以使用更短的前缀来表示它们。

  3. zstd是 基于哈夫曼编码和字典压缩的思想的 FSE 算法

更进一步

在有压缩的前提下,排序一定会让存储空间降低吗?
不一定,因为要想通过排序让存储空间降低,则必须将相似的值放在一起,如果数据在排序键上没有很好的分布,那么排序可能会增加文件大小,反之则可以降低文件大小

你可能感兴趣的:(工作之行,parquet,数仓,排序,数据仓库,iceberg)