PySpark大DataFrame多Join场景下的最优重分区策略咨询
最优方案选择分析
核心原则:大DataFrame的shuffle操作代价极高,要尽可能减少shuffle次数,小表广播是正确选择(避免小表shuffle)。
对比两种方案的优劣:
方案一:先执行
df.repartition("key1","key2","key3"),再分别与广播的df1、df2做Join
仅需对大表df做一次shuffle(重分区),后续两次Join都是基于广播小表的本地匹配:- 和df1按key1 Join时,df已按key1分区,每个分区的数据可直接与广播到executor的df1副本完成本地匹配,无额外shuffle;
- 和df2按key2、key3 Join时,同理,df已按这两个key分区,直接用本地广播的df2副本即可完成Join,无需再做shuffle。
方案二:先按key1重分区df并与df1 Join,再按key2、key3重分区并与df2 Join
会触发两次全量shuffle:第一次是按key1重分区大表df,第二次是对Join后的大表结果按key2、key3重分区。两次shuffle会带来双倍的IO、网络传输和计算开销,对大表来说完全没必要。
额外提醒
如果业务逻辑是先和df1 Join,再用Join后的结果与df2 Join,方案一依然适用:先重分区原df,完成第一次Join后,数据已保留key2、key3的分区信息,直接做第二次广播Join即可,无需再次重分区。
内容的提问来源于stack exchange,提问作者PAMPA ROY
相关产品推荐
相关产品推荐

