如何强制Spark来内联评估DataFrame操作

sme*_*eeb 7 distributed-computing lazy-evaluation apache-spark rdd spark-dataframe

根据Spark RDD文档:

Spark中的所有转换都是懒惰的,因为它们不会立即计算结果......这种设计使Spark能够更有效地运行.

有些时候我需要做一些操作,我dataframes倍右当时和现在.但是因为数据帧操作被" 懒惰地评估 "(如上所述),当我在代码中编写这些操作时,很少有人保证Spark会实际执行与其余代码内联的操作.例如:

val someDataFrame : DataFrame = getSomehow()
val someOtherDataFrame : DataFrame = getSomehowAlso()
// Do some stuff with 'someDataFrame' and 'someOtherDataFrame'

// Now we need to do a union RIGHT HERE AND NOW, because
// the next few lines of code require the union to have
// already taken place!
val unionDataFrame : DataFrame = someDataFrame.unionAll(someOtherDataFrame)

// Now do some stuff with 'unionDataFrame'...
Run Code Online (Sandbox Code Playgroud)

所以我的解决方法(到目前为止)已经运行.show().count()紧跟我的时间敏感数据帧操作,如下所示:

val someDataFrame : DataFrame = getSomehow()
val someOtherDataFrame : DataFrame = getSomehowAlso()
// Do some stuff with 'someDataFrame' and 'someOtherDataFrame'

val unionDataFrame : DataFrame = someDataFrame.unionAll(someOtherDataFrame)
unionDataFrame.count()  // Forces the union to execute/compute

// Now do some stuff with 'unionDataFrame'...
Run Code Online (Sandbox Code Playgroud)

... 强制 Spark执行数据帧操作然后在那里,内联.

这对我来说非常hacky/kludgy.所以我要问:是否有一种更普遍接受和/或有效的方法来强制数据帧操作按需发生(而不是懒惰评估)?

gsa*_*ras 7

.

你必须调用一个动作来强制Spark做实际的工作.转换不会触发这种效果,这也是爱情的原因之一.


顺便说一句,我很确定非常清楚什么时候必须"在这里和现在"完成,所以你可能正在关注错误的观点.


你能否确认一下count()并被show()视为"行动"

您可以在文档中看到Spark的一些操作功能,其中count()列出了这些功能.show()是不是,我之前没有使用它,但感觉它是一个动作 - 如何在不做实际工作的情况下显示结果?:)

你是否暗示Spark会自动接受,并做联盟(及时)?

是的!:)

记住你调用的转换,当一个动作出现时,它会在正确的时间内完成它们!


事情要记住:因为这个政策,做一个只有当实际工作的行动出现,你不会看到你在你拥有了一个逻辑错误转换(S),直到动作发生!