1.主要区别?
repartition
和coalesce
是Spark中用于重新分区数据的方法。它们的区别在于:
-
功能不同:
repartition
方法用于增加或减少分区数量,而coalesce
方法仅用于减少分区数量。 -
数据移动:
repartition
方法会进行数据重分区,可能会导致数据的移动和重新分配。这是因为repartition
方法会将数据打散并重新分配到新的分区中,这可能需要进行数据的网络传输。相比之下,coalesce
方法只会在必要时合并分区,不会进行数据的移动,因此性能更高。 -
分区顺序:
repartition
方法会打乱数据的分区顺序,而coalesce
方法会保持数据的分区顺序不变。这是因为repartition
方法会使用随机算法重新分配数据到新的分区中,而coalesce
方法会尽量将数据合并到相邻的分区中,以保持数据的有序性。
下面是一些示例代码,以更好地理解它们之间的区别:
在上面的示例中,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;