对于“迭代算法”,转换为 RDD 然后再转换回 Dataframe 有什么优势

All*_*Han 5 apache-spark rdd apache-spark-sql catalyst-optimizer

我正在阅读High Performance Spark,作者做出以下声明:

虽然 Catalyst 优化器非常强大,但它目前遇到挑战的情况之一是非常大的查询计划。这些查询计划往往是迭代算法的结果,例如图算法或机器学习算法。一个简单的解决方法是将数据转换为 RDD,并在每次迭代结束时转换回 DataFrame/Dataset,如例 3-58 所示。

示例 3-58 被标记为“通过 RDD 进行往返以削减查询计划”,并复制如下:

val rdd = df.rdd
rdd.cache()
sqlCtx.createDataFrame(rdd. df.schema)
Run Code Online (Sandbox Code Playgroud)

有谁知道需要此解决方法的根本原因是什么?

作为参考,已针对此问题提交了错误报告,可通过以下链接获取: https ://issues.apache.org/jira/browse/SPARK-13​​346

似乎没有解决办法,但维护者已经解决了这个问题,并且似乎不认为他们需要解决它。

小智 1

根据我的理解,迭代算法的谱系不断增长,即

步骤1:读取DF1、DF2

步骤2:根据DF2值更新DF1

步骤3:读取DF3

步骤4:根据DF3值更新DF1

..ETC..

在这种情况下,DF1 谱系不断增长,除非使用 DF1.rdd 截断它,否则它将在 20 次左右的迭代后使驱动程序崩溃。