由于改组而在持久保存数据帧后火花非持久数据帧

时间:2018-11-15 09:55:11

标签: apache-spark

假设我们有以下情况:

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吗?

1 个答案:

答案 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吗?

不。