Spark repartition 和 coalesce
Spark 的两个常用操作
repartition
repartition 将全局数据进行shuffle为指定分区大小。spark 可以根据用户指定的列或者特定的分区数目以及指定的hash函数进行数据分区。
coalesce
coalesce 通过分区数据移动的方式达到降低数据分区的效果,不会增加数据分区。相比repartition 而言,coalesce发生的数据混洗更小,是一个更高效的操作。
示例
假设原始分区如下
node1 = 1, 2, 3
node2 = 4, 5, 6
node3 = 7, 8, 9
node4 = 10, 11, 12
repartition(2) 之后可能会变成如下
node1 = 4, 1, 3, 2, 5, 6
node2 = 8, 9, 7, 12, 10, 11
coalesce(2) 之后可能会变成如下
node1 = 1, 2, 3 + (10, 11, 12)
node3 = 7, 8, 9 + (4, 5, 6)
基于上面的原理,我们封装一个函数用于将DataFrame 转化为指定分区
def repartition_df(df, num_partitions):
cur_partitions = df.rdd.getNumPartitions()
if cur_partitions = num_partitions:
return df
if cur_partitions > num_partitions:
df = df.coalesce(num_partitions)
else:
df = df.repartition(num_partitions)
return df