我正在觀察一些奇怪的問題。我不確定是我缺乏對火花的了解還是什么。
我有一個資料框,如下面的代碼所示。我從中創建了一個臨時視圖,并且我觀察到在合并操作之后,該臨時視圖變為空。不知道為什么。
val myDf = getEmployeeData()
myDf.createOrReplaceTempView("myView")
// Result1: Below lines display all the records
myDf.show()
spark.Table("myView").show()
// performing merge operation
val sql = s"""MERGE INTO employee AS a
USING myView AS b
ON a.Id = b.Id
WHEN MATCHED THEN UPDATE SET *
WHEN NOT MATCHED THEN INSERT *"""
spark.sql(sql)
// Result2: ISSUE is here. myDf & mvView both are empty
myDf.show()
spark.Table("myView").show()
編輯
getEmployeeData 方法在兩個資料幀之間執行連接并回傳結果。
df1.as(df1Alias).join(df2.as(df2Alias), expr(joinString), "inner").filter(finalFilterString).select(s"$df1Alias.*")
uj5u.com熱心網友回復:
Spark 中的資料幀是惰性求值的,即。直到像.show,這樣的動作.collect被執行或者它們被用于 SQL DDL 操作時才會被執行。這也意味著,如果您再次參考它,它將再次被重新評估。
假設沒有其他可以搞砸的后臺活動,顯然你的功能getEmployeeData取決于employee表。它在合并之前和之后執行,可能會產生不同的結果。
為了防止它,您可以檢查資料框:
myView.checkpoint()
或明確實作它:
myView.write.saveAsTable("myViewMaterialized")
稍后參考物化版本。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/518674.html
