SPARK:何时删除数据帧或RDD,或者直到何时处于活动状态,不涉及缓存.给定:对一些后续的RDD/DF调用操作



我想知道数据帧或RDD何时保持活动状态或何时死亡/删除。数据帧和RDD有什么不同吗?

  1. 所有父数据帧是否在内存中保持活动状态,直到最后一个数据帧/RDD 写入 磁盘或显示在屏幕上
  2. 将转换应用于数据帧/RDD 时,将创建新的数据帧/RDD。 在这种情况下,10 个转换是否会创建 10 个数据帧/RDD,它们是否会一直有效,直到应用程序结束或最终数据帧/RDD 写入磁盘? 请参阅下面的示例代码

    val transformDF1 =  readDF.withColumn("new_column", sometransformation)
    val transformDF2  = transformDF1.groupBy("col1","col2").agg(sum("col3"))
    transformDF2.write.format("text").save(path)
    
  3. 当我们在
  4. 分配给变量之前将转换链接在一起时,情况如何。 如下所示

val someDF = df
.where(some_col = "some_val")
.withColumn("some-page", col("other_page") + 1)
.drop("other_page")
.select(col("col1"), col("col2")
)
vall someDF1 =  someDF.join(someotherDF, joincond, "inner"). select("somecols")
val finalDF =  someDF1.distinct()
finalDF.write.save(path)

在上面的代码中

  1. 我们从 df 数据帧上的转换链创建了一些 DF。现在,链中的每个转换都会创建一个数据帧。因此,由链中的转换创建的每个数据帧是否在内存中保持活动状态,直到 finalDF 写入文件,或者是否只有链中分配给变量 someDF 的最后一个转换的数据帧保留在内存中。如果是后者,则直到保留某些DF,如果是前者,则直到它们保留在内存中
  2. 其他数据帧 someDF1 呢,它的生命周期是多少?
  3. 如果控件移动到链中的新转换后没有保留链式转换,那么是否最好链接尽可能多的转换以帮助 维护更多可用内存。但是,在链式转换的情况下,GC 会是一个陷阱/瓶颈吗(如果我们将它们大量链接(?

Spark RDD的要点是所有的执行都是懒惰的。这意味着在调用任何操作之前,内存中不会有数据。DataFrame也是如此,因为DF实际上是RDD上的包装器。

Spark 以延迟加载方式执行所有执行,这意味着在调用任何操作之前,RDD 不会在内存中。 对于每个广泛的依赖关系,Spark将存储中间数据而不是RDD,请注意,只有中间数据将被存储而不是RDD(除非其缓存(。

最新更新