从缓存中删除 spark 数据帧

Posted

技术标签:

【中文标题】从缓存中删除 spark 数据帧【英文标题】:Drop spark dataframe from cache 【发布时间】:2015-11-20 00:42:10 【问题描述】:

我正在使用带有 python api 的 Spark 1.3.0。在转换庞大的数据帧时,我缓存了许多 DF 以加快执行速度;

df1.cache()
df2.cache()

一旦某些数据帧的使用结束并且不再需要,我如何从内存中删除 DF(或取消缓存它??)?

例如,df1 用于整个代码,而df2 用于少量转换,之后就不再需要它。我想强行删除df2 以释放更多内存空间。

【问题讨论】:

@Paul 记录一下,这实际上不是重复的原因是因为 DataFrame API 与 RDD API 不同。然而,这个方法调用在它们之间是共享的。 【参考方案1】:

只需执行以下操作:

df1.unpersist()
df2.unpersist()

Spark 自动监控每个节点上的缓存使用情况并退出 以最近最少使用 (LRU) 方式的旧数据分区。如果你 想手动移除一个 RDD 而不是等待它掉落 从缓存中取出,使用 RDD.unpersist() 方法。

【讨论】:

并且注意在lineage结束后unpersist df,所以在涉及到缓存df的最后一个action之后。 我为我的一个数据框“df”尝试了这个,当我执行 df.show() 时,df 仍在显示数据。它什么时候真正不持久?【参考方案2】:

如果数据框注册为用于 SQL 操作的表,例如

df.createGlobalTempView(tableName) // or some other way as per spark verision

然后可以使用以下命令删除缓存,off-course spark也会自动删除

火花 >= 2.x

这里sparkSparkSession的一个对象

从缓存中删除一个特定的表/df

 spark.catalog.uncacheTable(tableName)

从缓存中删除所有表/dfs

 spark.catalog.clearCache()

火花

从缓存中删除一个特定的表/df

 sqlContext.uncacheTable(tableName)

从缓存中删除所有表/dfs

 sqlContext.clearCache()

【讨论】:

我为我的 RDD 'df' 尝试了这些。为什么输入 df.show() 仍然显示数据? df.show() 将显示数据而不考虑缓存,只要数据框的输入源可用。【参考方案3】:
    如果您需要在删除期间阻止 => df2.unpersist(true) 解除阻塞 => df2.unpersist()

【讨论】:

以上是关于从缓存中删除 spark 数据帧的主要内容,如果未能解决你的问题,请参考以下文章

Spark 1.6 数据帧缓存无法正常工作

concat_ws 从 spark 数据帧的输出中删除空字符串

在内存中缓存 Spark 数据帧是不是有额外的开销?

在 2 个数据帧 Spark 中缓存同一张表两次

缓存后正在重新评估 Spark 数据帧

Spark 2.0+ 即使数据帧被缓存,如果它的源之一发生变化,它会重新计算吗?