[英]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會自動接受,並做聯盟(及時)?
是的 ! :)
spark會記住你調用的轉換 ,當一個動作出現時,它會在正確的時間內完成它們!
事情要記住:因為這個政策,這樣做會出現一個動作只有在實際工作中,你不會看到你在你的轉化 (S)有一個邏輯上的錯誤,直到行動發生!
我同意你的意見,在某些時候你想要在你需要的時候采取行動。 對於.eg,如果您使用Spark流式傳輸數據,並且您想要評估在每個RDD上完成的轉換,而不是為每個RDD累積轉換,並且突然對這大量數據集執行操作。
現在,假設您有一個DataFrame,並且已經完成了所有轉換,那么您可以使用sparkContext.sql("CACHE table <table-name>")
。
此緩存是急切緩存,這將觸發此DataFrame上的操作,並評估此DataFrame上的所有轉換。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.