我需要向 Spark DataFrame 添加幾列。兩列的值都是有條件的,使用when
子句,但它們的條件相同。
val df: DataFrame = ???
df
.withColumn("colA", when(col("condition").isNull, f1).otherwise(f2))
.withColumn("colB", when(col("condition").isNull, f3).otherwise(f4))
由于兩個when
子句中的條件相同,有沒有一種方法可以重寫而不重復自己?我的意思不僅僅是將條件提取到一個變數中,而是實際上將其簡化為一個when
子句,以避免在 DataFrame 上多次運行測驗。
另外,如果我這樣離開,Spark 會計算兩次條件,還是能夠優化作業計劃并只運行一次?
uj5u.com熱心網友回復:
對應的列f1
/f3
和f2
/f4
可以打包成一個陣列,然后在評估條件后分成兩個不同的列。
df.withColumn("colAB", when(col("condition").isNull, array('f1, 'f3)).otherwise(array('f2, 'f4)))
.withColumn("colA", 'colAB(0))
.withColumn("colB", 'colAB(1))
我的代碼和問題中的代碼的物理計劃colAB
(忽略中間列)相同:
== Physical Plan ==
LocalTableScan [f1#16, f2#17, f3#18, f4#19, condition#20, colA#71, colB#78]
== Physical Plan ==
LocalTableScan [f1#16, f2#17, f3#18, f4#19, condition#20, colAB#47, colA#54, colB#62]
所以在這兩種情況下,條件只被評估一次。condition
如果是常規列,這至少是正確的。
將這兩個陳述句結合起來的一個原因when
可能是代碼可讀性更好,盡管這種判斷取決于讀者。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/508580.html