Spark Scala FoldLeft 性能缓慢

问题描述

嗨,我正在尝试在具有 280 列的数据帧中进行 scdtype2 更新。

val newYRecs = stgDF.columns
                .foldLeft(joinedDF)
                  {(tempDF,colName) => 
                      tempDF.withColumn("new_" + colName,when(col("stg." + colName).isNull,col("tgt."+ colName)).otherwise(col("stg."  + colName))).drop(col("stg." + colName)).drop(col("tgt." + colName)).withColumnRenamed("new_" + colName,colName) 

仅执行此操作就需要 8 分钟。有什么办法可以优化吗?

解决方法

根据 this 文章,withColumn 似乎具有 Catalyst 优化器的隐藏成本,当用于许多列时会影响性能。我会尝试使用建议的解决方法并执行类似的操作(同时,您还可以使用 coalesce 使代码更简洁):

val newYRecs = joinedDF.select(stgDF.columns.map{ colName =>
      coalesce(col("stg." + colName),col("tgt."+ colName)) as colName
}: _*)