我需要向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会计算两次条件吗?或者它能够优化工作计划并只运行一次?
1条答案
按热度按时间kg7wmglp1#
相应的列
f1
/f3
和f2
/f4
可以打包成一个数组,然后在评估条件后分成两个不同的列。我的代码和问题中的代码的物理计划是相同的(忽略中间列
colAB
):所以在这两种情况下,条件只计算一次。如果
condition
是一个常规列,则至少是这样。将两个
when
语句组合在一起的原因可能是代码可读性更好,尽管这取决于读者的判断。