Spark - repartition()与coalesce()的区别
repartition 方法会对数据进行full shuffle(完全洗牌),即它会完全创建新的数据分区,这些分区的数据量是均衡分布的(在大数据量下尤为均衡)。
coalesce 不会对数据进行full shuffle,它会保持一些分区不动,只移动另外分区数据到这些不动的分区上,以使得需要shuffle的数据量最小化,但是这也会导致各分区的数据量不一致。
例如有以下4个分区:
Partition 1 = 1,2,3
Partition 2 = 4,5,6
Partition 3 = 7,8,9
Partition 4 = 10,11,12
利用coalesce合并为2个分区,可能会变成如下格式,Partition 1和Partition 3的数据不动,只移动了Partition 2和Partition 4:
Partition 1 = 1,2,3 + (10,11,12)
Partition 3 = 7,8,9 + (4,5,6)
如果使用repartition合并为2个分区,数据可能会变成如下格式,原来的分区数据被完全拆散,重新创建了两个新的分区。
Partition 5 = 1,2,3,10,11,12
Partition 6 = 7,8,9,4,5,6