数据岗位面试题更新 2026-08-05

请解释在 Spark 中如何利用 repartition 与 coalesce 对分区数量进行调整,并阐述两者之间的区别。

数据技术原理技术选型方案权衡

考察说明

考查对 Spark 分区调整方法及其底层机制的理解,以及在实际场景中的选择能力。

回答思路

  1. 【回答框架 1】repartition 是宽依赖操作,会触发 shuffle,将数据重新均匀分布到指定数量的分区,通常用于增加分区数以提升并行度。coalesce 是窄依赖操作,默认不进行 shuffle,只合并现有分区,通常用于减少分区数以减少文件数量或避免小文件问题。
  2. 【回答框架 2】实现上,coalesce 在减少分区时,会将数据从多个分区合并到同一个分区,可能导致数据倾斜;而 repartition 通过 shuffle 实现数据的重新分配,能更好地平衡分区数据量。
  3. 【回答框架 3】当需要增加分区数时,只能使用 repartition;当需要减少分区数且分区数变化较小时,优先使用 coalesce 以减少 shuffle 开销;若分区数大幅减少或需要数据均衡,也应考虑使用 repartition。
  4. 【回答框架 4】在场景选择上,例如写入文件时希望减少输出文件数量,可用 coalesce;执行 join 或 groupBy 时希望提高并行度,可用 repartition。还需要注意,coalesce 并非绝对无 shuffle,若开启某些配置或在特定条件下,也可能触发 shuffle。
  5. 【关键点 1】repartition 触发 shuffle,适合增加或减少分区并保持数据均衡。
  6. 【关键点 2】coalesce 默认不触发 shuffle,适合减少分区且分区数变化不大时使用,以减少网络开销。
  7. 【关键点 3】增加分区只能使用 repartition,减少分区优先考虑 coalesce,但需警惕数据倾斜。
  8. 【易错点 1】误以为 coalesce 能增加分区数,实际上 coalesce 只能缩减分区,增加分区必须用 repartition。
  9. 【易错点 2】忽略数据倾斜风险,直接使用 coalesce 减少分区可能导致某个分区数据量过大,影响后续任务性能。
  10. 【易错点 3】以为 coalesce 完全不触发 shuffle,在特定版本或配置下,coalesce 可能仍会发生 shuffle,性能表现与预期不同。