PySpark中函数内创建的DataFrame内存是否会在函数调用后释放?
def my_function(): df = Spark.createDataFrame(Data, schema) # 对dataframe执行若干转换操作 df1 = transformation_1(df) df2 = transformation_2(df1) df3 = transformation_2(df2) return df3 if __name__ == "__main__": df = my_function() df.collect()
问题解答
Python层的局部变量会正常被垃圾回收,不会一直驻留到程序结束。
函数内部定义的df、df1、df2都属于函数局部变量,当my_function执行完成、返回df3之后,函数对应的栈帧会被销毁,这些局部变量的引用计数会直接归零,只要没有其他外部变量引用这几个对象,Python垃圾回收器就会回收它们占用的内存,不需要等到整个程序运行结束。注意Spark侧的缓存特殊逻辑
Spark DataFrame本身是惰性计算的,你写的所有转换操作都只是在构建计算血缘(Lineage),并不会实际生成存储数据,所以这些DataFrame对象本身占用的内存非常小,都是血缘描述信息。
如果你没有给df、df1、df2显式调用cache()或者persist()方法标记缓存,Executor侧也不会存储这些DataFrame的计算结果,不会占用额外内存。但如果你给这几个DataFrame加了缓存,那么触发collect()这类行动算子之后,缓存的计算结果会一直保留在Executor的内存/磁盘中,就算Python端的变量被回收也不会自动释放,必须手动调用unpersist()方法才能释放,或者等整个Spark应用退出后才会释放。
内容的提问来源于stack exchange,提问作者Arthur
相关产品推荐
相关产品推荐

