scala Spark -在相同的when条件下添加多个列

rqqzpn5f  于 2023-04-06  发布在  Scala
关注(0)|答案(1)|浏览(175)

我需要向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会计算两次条件吗?或者它能够优化工作计划并只运行一次?

kg7wmglp

kg7wmglp1#

相应的列f1/f3f2/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语句组合在一起的原因可能是代码可读性更好,尽管这取决于读者的判断。

相关问题