从缓存中删除 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
这里spark
是SparkSession
的一个对象
从缓存中删除一个特定的表/df
spark.catalog.uncacheTable(tableName)
从缓存中删除所有表/dfs
spark.catalog.clearCache()
火花
从缓存中删除一个特定的表/df
sqlContext.uncacheTable(tableName)
从缓存中删除所有表/dfs
sqlContext.clearCache()
从缓存中删除一个特定的表/df
sqlContext.uncacheTable(tableName)
从缓存中删除所有表/dfs
sqlContext.clearCache()
【讨论】:
我为我的 RDD 'df' 尝试了这些。为什么输入 df.show() 仍然显示数据? df.show() 将显示数据而不考虑缓存,只要数据框的输入源可用。【参考方案3】:-
如果您需要在删除期间阻止 => df2.unpersist(true)
解除阻塞 => df2.unpersist()
【讨论】:
以上是关于从缓存中删除 spark 数据帧的主要内容,如果未能解决你的问题,请参考以下文章