You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PySpark中何时使用cache()?单最终操作场景下缓存是否有用?

单个Action场景下PySpark Cache()的作用分析

先明确核心结论:在你给出的这类「单个Action且每个中间DataFrame仅被引用一次」的场景下,使用cache()不仅没用,反而可能拖慢性能。原因得从Spark的执行机制说起:

Spark是懒执行模型,只有触发Action(比如count())时才会解析整个DAG(有向无环图)执行计划,然后一次性完成所有依赖计算。在你的示例里:

df = sc.sql("select * from table")
df2 = sc.sql("select * from table2")
df  = df.where({something})
df2  = df2.where({something})
df3 = df.join(df2).where({something})
df3.count()

每个中间DataFrame(df、df2)都只被后续步骤引用一次,Spark会直接构建从原始表扫描到最终join的完整执行链,每个阶段只会计算一次,不会重复执行任何步骤。这时候加cache(),反而会让Spark多做一步:把中间结果写入内存/磁盘缓存,额外消耗IO和内存资源,甚至因为缓存写入的开销降低整体执行速度。

但也有例外情况——如果单个Action的DAG中,某个中间DataFrame被多次引用,这时候cache()就有价值了。比如下面的场景:

df = sc.sql("select * from large_table")
# df被两个后续分支引用
df_agg = df.groupBy("id").sum("value")
df_filtered = df.where("value > 100")
final_df = df_agg.join(df_filtered, on="id")
final_df.count()

这里df在DAG里被两个分支依赖,Spark默认可能会重复计算两次large_table的扫描和后续处理(取决于执行计划优化,但复杂场景下很容易出现重复计算)。这时候给df加上cache(),就能让Spark只计算一次df的结果并缓存,后续两个分支直接复用缓存数据,避免重复执行昂贵的表扫描和计算。

总结一下:

  • 单个Action且中间数据仅被引用一次:别用cache(),纯浪费资源
  • 单个Action但中间数据被多次复用:用cache()避免重复计算,提升性能

内容的提问来源于stack exchange,提问作者Diogo Santos

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 17:46:08