记录一个客户问题
客户用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 接口来做类似的事情