【发布时间】:2019-02-21 21:25:10
【问题描述】:
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。所以我问:有没有更普遍接受和/或有效的方法来强制数据帧操作按需发生(而不是延迟评估)?
【问题讨论】:
-
对我来说,spark 似乎根本没有保留这些评估。我正在使用 Jupyter Notebook,当我连续两次调用 .show() 时,第二次仍然需要很长时间。我假设它重新计算了整个事情,即使我只是计算了它。有人可以确认吗?我正在寻找避免这些重新计算的方法。
标签: apache-spark lazy-evaluation distributed-computing rdd spark-dataframe