簡體   English   中英

如何強制Spark來內聯評估DataFrame操作

[英]How to force Spark to evaluate DataFrame operations inline

根據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'...

所以,我這個(迄今為止)的解決方法已運行.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做實際的工作。 轉換不會觸發這種效果,這也是愛情的原因之一。


順便說一句,我很確定非常清楚何時必須“在這里和現在”完成某些事情,所以你可能正在關注錯誤的觀點。


你能否確認count()show()被認為是“行動”

您可以在文檔中看到Spark的一些動作功能,其中列出了count() show()不是,我之前沒有使用它,但感覺就像是一個動作 - 如何在不做實際工作的情況下顯示結果? :)

你是否暗示Spark會自動接受,並做聯盟(及時)?

是的 :)

記住你調用的轉換 ,當一個動作出現時,它會在正確的時間內完成它們!


事情要記住:因為這個政策,這樣做會出現一個動作只有在實際工作中,你不會看到你在你的轉化 (S)有一個邏輯上的錯誤,直到行動發生!

我同意你的意見,在某些時候你想要在你需要的時候采取行動。 對於.eg,如果您使用Spark流式傳輸數據,並且您想要評估在每個RDD上完成的轉換,而不是為每個RDD累積轉換,並且突然對這大量數據集執行操作。

現在,假設您有一個DataFrame,並且已經完成了所有轉換,那么您可以使用sparkContext.sql("CACHE table <table-name>")

此緩存是急切緩存,這將觸發此DataFrame上的操作,並評估此DataFrame上的所有轉換。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM