我有一个创建为全局变量(可变)的数据框。
var output
此变量通过不同的联接在不同的函数中多次更新。
def func1 = {
// some code
output = output.join(temp1, Seq("id"))
}
def func2 = {
// some code
output = output.join(temp2, Seq("id"))
}
在上述几个函数调用之后,output
被传递到另一个函数performCalculation
,在其中执行一些计算。我的问题是,根据在代码中调用func1和func2的次数,我在org.apache.spark.memory.SparkOutOfMemoryError: Unable to acquire 36 bytes of memory, got 0
中遇到了OOM错误(performCalculation
)。
但是,如果我在将输出传递到performCalculation
之前编写输出,然后将其读回另一个变量,然后将第二个变量发送到performCalculation
,则可以正常工作。
ouput.write.csv(path)
val newOutput = spark.read.csv(path)
performCalculation(newOutput)
很明显,spark不喜欢使用可变变量,因此我不得不重写该部分。但是,我尝试清除缓存并每次都在output
和func1
内重新缓存func2
output
已更新,但似乎无济于事。
output.unpersist()
output = output.join(temp2, Seq("id"))
output.cache()
我做错了什么,我可以做些什么来改善这一点。