Spark行动操作后内存数据去向及重复执行show是否重读源文件的问询
Spark惰性执行后的内存变化与重复执行问题
核心结论
默认情况下,执行完show()这类行动操作后,内存中的中间结果会被清除;第二次执行df1.show()时,Spark会重新读取example.csv文件,从头执行所有转换操作。
具体分析
- Spark的转换操作(比如
withColumn)是惰性的,只有遇到行动操作(比如show())才会触发实际计算。 - 在你的代码示例中,第一次
df1.show()触发计算时,Spark会按执行计划完成:读取CSV文件 → 生成原始DataFramedf→ 添加列Y得到df1→ 输出前20行。计算完成后,这些临时生成的中间数据不会被保留,会被Spark的内存管理机制回收。 - 当你第二次调用
df1.show()时,由于之前的中间结果没有被缓存,Spark会重新解析执行计划,再次读取example.csv,重复整个转换和计算流程。
如何避免重复读取
如果想让中间结果保留在内存中,避免重复计算,需要显式调用缓存方法:
df1 = df.withColumn("Y", df["X"]).cache() # 或者用persist()指定存储级别 df1.show()
执行完第一次show()后,df1的数据会被缓存到内存(或指定存储介质),第二次show()就会直接使用缓存的数据,无需重新读取原文件。
内容的提问来源于stack exchange,提问作者Mohi
相关产品推荐
相关产品推荐

