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

问题描述 投票:6回答:2

根据Spark RDD docs

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

有时我需要对我的数据帧进行某些操作。但是因为数据帧操作被“懒惰地评估”(如上所述),当我在代码中编写这些操作时,很少有人保证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'...

所以我的解决方法(到目前为止)一直是在我的时间敏感数据帧操作后立即运行.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'...

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

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

apache-spark lazy-evaluation distributed-computing rdd spark-dataframe
2个回答
7
投票

没有。

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


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


你能否确认count()show()被认为是“行动”

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

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

是! :)

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


要记住的事情:由于这个政策,只有在出现动作时才进行实际工作,在动作发生之前,您不会在转换中看到逻辑错误!


2
投票

我同意你的意见,在某些时候你想要在你需要的时候采取行动。对于.e.g,如果您使用Spark流式传输数据,并且您想要评估在每个RDD上完成的转换,而不是为每个RDD累积转换,并且突然对这大量数据集执行操作。

现在,假设您有一个DataFrame,并且您已经完成了所有转换,那么您可以使用sparkContext.sql("CACHE table <table-name>")

此缓存是急切缓存,这将触发此DataFrame上的操作,并评估此DataFrame上的所有转换。

© www.soinside.com 2019 - 2024. All rights reserved.