Spark中父DataFrame执行unpersist对子DataFrame缓存的影响疑问
Spark DataFrame persist/unpersist 的正确行为解析
核心规则
- persist():每个调用该方法的DataFrame,都会独立将自身执行计划的计算结果持久化到缓存中,父、子DF的缓存是完全独立的实体,不存在绑定关系。
- unpersist():仅清除调用该方法的DataFrame自己的缓存,不会自动级联清除子DF的缓存——只有一种特殊情况例外:子DF仅定义并调用了persist,但从未触发过action操作(比如
show、count),此时子DF的缓存依赖父DF的计算结果,父DF被unpersist后,子DF在首次执行action时会重新计算,之前的persist相当于未生效,看起来像是被清除了。
你的测试场景为何不同
你遇到的现象完全符合Spark设计逻辑,和你提到的Stack Overflow问题结论差异的原因在于场景不同:
- 你在创建
childDF后立刻执行了show(false),触发了action,此时childDF已经完成计算并独立写入缓存,它的缓存内容是过滤后的结果,和parentDF的缓存没有依赖关系了。 - 当你调用
parentDF.unpersist()时,只会移除parentDF对应的缓存条目,childDF的缓存是独立存储的,自然不会被清除。后续基于childDF创建grandChildDF并执行show时,依然能从childDF的缓存中读取数据,这也和你在Yarn UI中看到的结果一致。
那个Stack Overflow问题里的情况,大概率是子DF只做了persist但没触发action,此时子DF的缓存还没实际生成,依赖父DF的计算。父DF被unpersist后,子DF首次执行action时会重新计算,之前的persist并未实际落地,所以看起来像是子DF也被取消了持久化。
如何确认缓存状态
你可以通过两种方式验证:
- 查看Spark UI的Storage页面,确认
parentDF已从缓存列表中移除,childDF依然存在。 - 调用代码
println(childDF.isCached),直接输出childDF的缓存状态。
内容的提问来源于stack exchange,提问作者shivam
相关产品推荐
相关产品推荐

