首页 > 解决方案 > 将窗口函数应用于多列

问题描述

我有一个超过 20 列的 DF。对于每一列,我需要找到前导值并将其添加到结果中。

我一直在使用 with 列。

df
.withColumn("lead_col1", lead("col1").over(window))
.withColumn("lead_col2", lead("col2").over(window))
.withColumn("lead_col3", lead("col3").over(window))

还有17行这样的。有没有办法使用更少的代码来做到这一点?我尝试使用这个示例,但它不起作用。

标签: apache-sparkapache-spark-sql

解决方案


检查下面的代码,它比foldLeft.

import org.apache.spark.sql.expressions._

val windowSpec = ...
val windowColumns = Seq(
                         ("lead_col1", "col1"),
                         ("lead_col2","col2"),
                         ("lead_col3","col3")
                    ).map(c => lead(col(c._2),1).over(windowSpec).as(c._1))

val windowColumns = df.columns ++ windowColumns

应用于windowColumnsDataFrame。

df.select(windowColumns:_*).show(false)

推荐阅读