我有一個火花資料框。我試圖洗掉一個列,但在某些情況下,該列似乎仍然存在。
my_range = spark.range(1000).toDF("number")
new_range = my_range.withColumn('num2', my_range.number*2).drop('number')
# can still sort by "number" column
new_range.sort('number')
這是一個錯誤嗎?或者我錯過了什么?
Spark 版本是 v3.3.1 python 3 我在 Mbook pro M1 20221
uj5u.com熱心網友回復:
,我在你的樣本資料集上呼叫了 .explain(True),讓我們看看輸出:
== Parsed Logical Plan ==
'Sort ['number ASC NULLS FIRST], true
- Project [num2#61L]
- Project [number#59L, (number#59L * cast(2 as bigint)) AS num2#61L]
- Project [id#57L AS number#59L]
- Range (0, 1000, step=1, splits=Some(8))
決議邏輯計劃是查詢計劃的第一個“原始”版本。在這里你可以在排序前看到專案 [num2#61L] - 這是你的下降
但在下一階段(分析邏輯計劃)它有所不同:
== Analyzed Logical Plan ==
num2: bigint
Project [num2#61L]
- Sort [number#59L ASC NULLS FIRST], true
- Project [num2#61L, number#59L]
- Project [number#59L, (number#59L * cast(2 as bigint)) AS num2#61L]
- Project [id#57L AS number#59L]
- Range (0, 1000, step=1, splits=Some(8))
Spark 足夠聰明,可以確定您需要此列,因此排序前的專案現在包含此列。為了符合您的代碼,排序后添加了新專案
現在是最后階段,如此優化的邏輯計劃:
== Optimized Logical Plan ==
Project [num2#61L]
- Sort [number#59L ASC NULLS FIRST], true
- Project [(id#57L * 2) AS num2#61L, id#57L AS number#59L]
- Range (0, 1000, step=1, splits=Some(8))
在我看來,這不是錯誤,而是 Spark 設計。請記住,您的代碼是在同一操作中執行的,因此由于 Spark 懶惰的性質,他足夠聰明,可以在計劃期間調整/優化某些代碼。
uj5u.com熱心網友回復:
第一個答案顯然是正確的,Spark 方法是否是一個好的實作還有待商榷——我認為是。
作為點綴:檢查點,如果使用,將意味著錯誤:
spark.sparkContext.setCheckpointDir("/foo2/bar")
new_range = new_range.checkpoint()
new_range.sort('number').show()
回報:
AnalysisException: Column 'number' does not exist. Did you mean one of the following? [num2];
'Sort ['number ASC NULLS FIRST], true
- LogicalRDD [num2#69L], false
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/537491.html
