我正在编写一个Spark模块,将一个Dataframe返回到主程序。
问题在于,在制作数据框时,我应该制作TempView,然后将其删除,但是我(我的模块)不知道在主程序中使用(物化)返回的数据框的时间。
在对返回的Dataframe进行延迟评估之后,应删除Tempview,否则会发生错误。并且应该删除临时视图,因为该程序将连续使用该模块处理超过TB的数千个数据集。 。
所以..我找不到安全删除临时视图的方法..我能做的只是在类的finalize()
方法中插入删除代码,这非常糟糕。
有什么想法可以安全删除临时视图吗?
(实际上,问题是一个更复杂的方法,我只是告诉了它一个简化的版本。 所以..在真实程序中,我不能使用相同的表名来覆盖..,不能选择不创建临时视图的选项,或者不能强制更早地评估DF并将其持久化..)
class Module {
val tempViewesToRemove = new ArrayBuffer[String]()
override protected def finalize(): Unit = {
localTempViewesToRemove.foreach(view=> sqlC.dropTempTable(name))
super.finalize()
}
def getDF(){
val df1 = ....
val df2 = ...
df1.createOrReplaceTempView(randomTableName)
tempViewesToRemove (randomTableName)
....
df2
}
}