假设我有这段代码(Spark 1.6.2):
val finalDF: DataFrame = if (test) {
val df = sqlContext.read.parquet(url).cache
df.write.parquet(url2)
df }
else
sqlContext.read.parquet(other_url)
如果我运行finalDF.unpersist
,它真的会从内存中清除finalDF
/df
的数据吗?如果没有,我该怎么做?
如果测试为真)。
基本上,当缓存更改数据帧时(即数据帧不可变),这意味着如果 finalDF 是 df,那么您将取消持久化 df。如果测试为假,那么一开始就不会创建 df,并且 sqlContext.read.parquet 的结果无论如何都不会缓存,但调用 unpersist 不会造成任何伤害。
您可以通过查看 UI(默认情况下在端口 4040 中)并查看存储选项卡来自行检查。它将在取消持久化之前和消失之后显示缓存的 df。
Spark 在最近最少使用的 (LRU) 算法中丢弃旧数据分区。但是,如果您需要手动清洁dataFrame.unpersist()
可以按预期工作。有关详细信息,请参阅 http://spark.apache.org/docs/latest/programming-guide.html#rdd-persistence