是否有任何方法可以在对RDD进行延迟评估之后执行最终代码?

时间:2019-12-10 10:25:41

标签: apache-spark rdd lazy-evaluation finalizer

我正在编写一个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
    }
}

0 个答案:

没有答案