将窗口函数应用于多列

jtjikinw  于 2021-05-19  发布在  Spark
关注(0)|答案(2)|浏览(428)

我有一个超过20列的df。对于每一列,我需要找到前导值并将其添加到结果中。
我一直在用column做这个。

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

还有17排这样的。有没有一种方法可以使用更少的代码?我试过用这个例子,但没用。

az31mfrm

az31mfrm1#

检查下面的代码,它比 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

应用 windowColumns 到Dataframe。

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

41ik7eoe2#

就像萨特建议的那样,foldleft是有效的。

val columns = df.columns
  columns.foldLeft(df){(tempDF, colName) =>
    tempDF.withColumn("lag_" + colName, lag($"$colName", 1).over(window))}

相关问题