Spark SQL repartition 为啥生成的文件变大了?

回眸只為那壹抹淺笑 提交于 2020-08-13 12:58:22

记录一个客户问题

客户用Spark SQL的repartition接口来解决Hive ORC表小文件的问题,发现文件膨胀的很厉害

比如原来有1000个小文件,总大小是500MB
repartition(10) 再 insert overwrite之后

10个文件 总大小是2~3GB

但是检查了一下最终的两个分区的 row count是一致的

调查结论

先说一下这两接口不同

repartition 把record完全打乱最终随机插入到10个文件 有Shuffle
coalesce 把相邻的分区的数据捏在一起,没有Shuffle

为啥shuffle打乱数据会让最终的表输出文件变大

其实就是 ORC 数据编码问题
原来的源分区其实是通过HashPartition的方式分布的,这样的数据分布可以让ORC的编码压缩得更加极致,而repartition完全打乱后导致本来在一个文件的相同记录分布到10个文件,那就是每个文件都有该记录的编码索引,那么最终文件就变大了

所以推荐使用 coalesce 接口来做类似的事情

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!