1.主要区别?

repartitioncoalesce是Spark中用于重新分区数据的方法。它们的区别在于:

  1. 功能不同repartition方法用于增加或减少分区数量,而coalesce方法仅用于减少分区数量。

  2. 数据移动repartition方法会进行数据重分区,可能会导致数据的移动和重新分配。这是因为repartition方法会将数据打散并重新分配到新的分区中,这可能需要进行数据的网络传输。相比之下,coalesce方法只会在必要时合并分区,不会进行数据的移动,因此性能更高。

  3. 分区顺序repartition方法会打乱数据的分区顺序,而coalesce方法会保持数据的分区顺序不变。这是因为repartition方法会使用随机算法重新分配数据到新的分区中,而coalesce方法会尽量将数据合并到相邻的分区中,以保持数据的有序性。

下面是一些示例代码,以更好地理解它们之间的区别:

 
# 使用repartition方法增加分区数量
df1 = df.repartition(10)
 
# 使用coalesce方法减少分区数量
df2 = df.coalesce(5)
 

在上面的示例中,df1将具有10个分区,而df2将具有5个分区。请注意,df1的分区顺序可能与原始数据的分区顺序不同,而df2的分区顺序将保持不变。

总结起来,repartition方法适用于需要增加或减少分区数量,并且不需要保持分区顺序的情况。而coalesce方法适用于只需要减少分区数量,并且需要保持分区顺序的情况。

 

 

2. SparkSql中怎么使用repartition?

一般我们是通过写spark.sql.shuffle.partitions+distribute by来控制写入文件的数量,但是会有个问题,spark.sql.shuffle.partitions写太大会导致小文件问题,写太小,当需要进行shuffle操作时要使用的分区数就小,并行处理和资源利用率小。现在我们可以在最后一步使用hint来控制文件的数据(不用写distribute by),在sql其它需要进行shuffle的地方调大spark.sql.shuffle.partitions就行了。

insert overwrite table table_name
select /*+ REPARTITION(100) */
*
from src_table;

3. coalesce的使用语法和repartition相似

 select /*+ COALESCE(1) */

 *

from src_table; 

 

posted on 2024-03-26 11:05  dw2nn  阅读(276)  评论(0编辑  收藏  举报