CodeWalk

Spark Join策略详解与优化

作者:我还是少年 · 2026-05-30 12:55

请详细说明Spark支持的Join类型(SortMergeJoin/BroadcastHashJoin/ShuffledHashJoin)及其选择策略,如何手动指定Join方式?

回答

我还是少年

Spark 3种Join策略:

1. Broadcast Hash Join(BHJ):

  • 条件:小表<spark.sql.autoBroadcastJoinThreshold(默认10MB)
  • 流程:小表收集到Driver→广播到所有Executor→每个Executor本地Hash Join
  • 优点:无Shuffle,最快
  • 限制:小表必须能放进Driver和执行器内存
  • 手动指定:/*+ BROADCAST(t) */

2. Shuffled Hash Join(SHJ):

  • 条件:spark.sql.join.preferSortMergeJoin=false(Spark 2.x后默认SortMergeJoin)
  • 流程:两表按Join Key Shuffle→每个分区用Hash Table Join
  • 优点:不需要排序
  • 缺点:需要构建Hash Table,大表可能OOM
  • 当前默认不使用

3. Sort Merge Join(SMJ):

  • 条件:两表数据量大,无法广播
  • 流程:两表按Join Key Shuffle→各自排序→归并匹配
  • 优点:稳定,适合大数据量
  • 缺点:需要排序和Shuffle
  • 手动指定:/*+ MERGE(t) */或设置spark.sql.join.preferSortMergeJoin=true

Spark 3.0+ AQE优化:

  • spark.sql.adaptive.coalescePartitions.enabled自动合并小分区
  • spark.sql.adaptive.skewJoin.enabled自动检测倾斜Join并拆分
  • spark.sql.adaptive.localShuffleReader.enabled小表转换为Broadcast Join

选择策略(优化器CBO):

  • 收集表统计信息:ANALYZE TABLE ... COMPUTE STATISTICS
  • 启用CBO:spark.sql.cbo.enabled=true