首页 > 解决方案 > 由于洗牌而再次持久化后,Spark unpersisting dataframe

问题描述

假设我们有以下场景:

val df: DataFrame = dataframe
val df2 = df.partition(col("id").cache
...
some transformations/joins by "id" resulting `val dfTransformed`
...
val df3 = dfTransformed.groupBy("name").agg(<someaggregations>)
val df4 = df3.partition(col("id").cache
...
some transformations/joins by "id"...
...

我的问题是我是否需要在某个时候取消 df2?或者当我坚持 df4 时,它会自动覆盖 df2?

如果我需要取消持久化 df2 那么何时取消持久化呢?

如果我做:

val df3 = df2.groupBy("name").agg(<someaggregations>)
df2.unpersist
val df4 = df3.partition(col("id").cache

我不会因为从内存中删除数据而损失一些性能吗?

如果我做:

val df3 = df2.groupBy("name").agg(<someaggregations>)
val df4 = df3.partition(col("id").cache
df2.unpersist

我真的不会坚持 df4 吗?

标签: apache-spark

解决方案


或者当我坚持 df4 时,它会自动覆盖 df2?

Spark 不会覆盖 df2,因为您可能有不同的计算分支 DAG 从 df2 开始,例如

val df4 = df3.partition(col("id").cache
val df2_1 = df2.groupBy("another_name")

我不会因为从内存中删除数据而损失一些性能吗?

一般来说是的。您需要知道的主要事情是 Spark 执行延迟执行。于是在舞台上

val df3 = f2.groupBy("name").agg(<someaggregations>)

实际上什么也没发生。查看官方 Spark 转换和操作指南。

我真的不会坚持 df4 吗?

不。


推荐阅读