假设我们有以下情况:
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吗?
答案 0 :(得分:0)
或者当我坚持使用df4时,它会自动覆盖df2吗?
Spark不会覆盖df2,因为您可能有一个从df2开始的计算DAG分支,例如
val df4 = df3.partition(col("id").cache
val df2_1 = df2.groupBy("another_name")
我是否会因为从内存中删除数据而损失一些性能?
通常是。您需要知道的主要事情是Spark会执行懒惰的执行。所以在舞台上
val df3 = f2.groupBy("name").agg(<someaggregations>)
实际上什么也没发生。请参阅Spark的官方变革和行动指南。
我实际上不会持久保留df4吗?
不。