Spark 中repartition和coalesce的区别

前言


在Apache Spark中,repartitioncoalesce是两种用于重新分区RDD或DataFrame的转换操作。它们的主要区别在于它们对分区数量的处理方式和使用场景。repartition 是 coalesce shuffle为True的实现。 两者使用的场景。 首先,repartition 的shuffle比较慢, coalesce 虽然不需要shuffle,但是,指定coalesce保留的partition数目后,只有相应数目的executor-cores 进行合并,其他的核会进行空计算,导致机器利用效率比较低。因此,如果需要保留的partition还是比较大,但同时比之前的partition小的,可以考虑coalesce,效率应该会高点:

   

repartition


repartition操作用于改变RDD或DataFrame的分区数量。这个操作可以增加或减少分区的数量,并且可以指定一个分区器来控制数据在新分区中的分布。

  • 增加分区:如果新的分区数大于当前分区数,repartition会将数据重新分配到更多的分区中,这可能会导致数据的重新洗牌(shuffle)。
  • 减少分区:如果新的分区数小于当前分区数,repartition会合并现有的分区,这同样可能涉及到数据的重新洗牌。
  • 使用场景:当需要调整数据的并行度以适应不同的计算资源或优化性能时使用。例如,如果一个任务因为数据倾斜而运行缓慢,可以通过增加分区来改善性能。

coalesce


coalesce操作用于减少RDD或DataFrame的分区数量,但是与repartition不同,它不会增加分区数量。

  • 减少分区coalesce只能减少分区数量,如果指定的分区数大于当前分区数,它将保持当前的分区数不变。
  • 无数据洗牌:与repartition不同,coalesce在减少分区时尽可能避免数据的重新洗牌,这使得它在减少分区时更加高效。
  • 使用场景:当需要减少数据的并行度,以减少资源消耗或在执行减少操作(如reducecollect)之前准备数据时使用。

 

df.repartition(1).write.mode("overwrite").option("header","true").option("emptyValue","")/
.csv("%s/chunjiechangan"%(save_path))

 

上一篇:Xcode设置cocoapods库的最低兼容版本


下一篇:【scikit-learn010】sklearn算法模型清单实战及经验总结(已更新)