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

Spark 2.2.0与2.4.7中getPersistentRDDs行为差异及全缓存对象获取咨询

解答

1. 如何获取所有缓存对象(包含DataFrame和RDD)

要同时获取缓存的DataFrame和RDD,需要结合Spark SQL的Catalog API和SparkContext的getPersistentRDDs方法:

获取缓存的DataFrame

从Spark 2.x开始,DataFrame的缓存由Spark SQL的Catalog组件独立管理,你可以通过以下方式获取所有缓存的DataFrame/表:

// 获取所有缓存的DataFrame、临时表或永久表
val cachedDataFrames = spark.catalog.listTables()
  .filter(_.isCached)
  .collect()

// 单独校验某个DataFrame是否被缓存(需传入DataFrame对应的临时视图名)
val isTargetDFCached = spark.catalog.isCached("your_temp_view_name")

获取缓存的RDD

继续使用原生的getPersistentRDDs方法即可:

val cachedRDDs = spark.sparkContext.getPersistentRDDs

合并两者获取全部缓存对象

如果需要统一管理两类缓存对象,直接将上述两个结果结合处理即可。

2. 方法行为变化的原因

这个差异是Spark SQL缓存机制迭代优化的结果:

  • 在Spark 2.2.0及更早版本中,DataFrame调用cache()时,底层会直接生成一个持久化RDD,并将其注册到SparkContext的持久化RDD集合中,因此getPersistentRDDs能捕获到这些关联RDD。
  • 从Spark 2.3+版本开始,Spark SQL引入了独立的CacheManager来管理DataFrame/DataSet的缓存。此时DataFrame的缓存不再依赖RDD的持久化逻辑,转而采用更适配SQL场景的优化策略(比如列式存储、查询计划复用、物化视图缓存等)。缓存的DataFrame对应的底层RDD不会再被注册到SparkContext的persistentRDDs集合中,因此getPersistentRDDs无法再获取到它们。

这个优化的核心目的是让Spark SQL的缓存机制更独立、高效,更好地适配SQL查询的特性,而非复用RDD的通用缓存逻辑。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 07:59:55