如何在spark中发布dataframe?

Kra*_* Li 4 python apache-spark

我正在使用 Spark 做一些计算。每 5 分钟,我就会得到一个新的数据框。我把它放入一个名为 dict_1_hour 的字典中,如下所示

dict_1_hour[timestamp] = dataframe
Run Code Online (Sandbox Code Playgroud)

新数据帧进入字典,旧数据帧从字典中弹出。里面只保存了12个dataframe,即最近1小时的数据。

所以我的问题是我应该如何释放这些数据帧以确保没有内存泄漏?

一个数据帧 API 似乎可以做到这一点。(我不知道参数是什么)

unpersist(blocking=True)
Marks the DataFrame as non-persistent, and remove all blocks for it from memory and disk.
Run Code Online (Sandbox Code Playgroud)

我认为的另一种方法就是从字典中弹出数据框。

dict_1_hour.pop(timestamp)
Run Code Online (Sandbox Code Playgroud)

Python 应该自动释放未使用的变量。但不知道用在这里是否合适。我担心如果您不明确发布数据框,spark 可能会保留数据框

所以请建议我应该使用哪种方式

zer*_*323 5

首先DataFrame,与 类似RDD,只是一个局部递归数据结构。我在 Python 和 JVM 方面都经历了与任何其他对象相同的垃圾收集周期。

您必须考虑的第二部分是持久数据(cachepersistcacheTable、随机文件等)。这通常由 Spark 内部处理,并且unpersist您对其生命周期没有太多控制。

del记住这两件事,除了对对象进行简单的处理之外,没有什么可以做的。

try:
    del dict_1_hour[timestamp]
except KeyError:
    pass
Run Code Online (Sandbox Code Playgroud)

不过,如果DataFrame已注册为临时表,请务必先取消注册:

from py4j.protocol import Py4JError

try:
    sqlContext.dropTempTable("df")
except Py4JError:
    pass
Run Code Online (Sandbox Code Playgroud)