将窗口函数应用于多列

时间:2020-10-16 10:12:10

标签: apache-spark apache-spark-sql

我有一个超过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行。有没有办法用更少的代码做到这一点?我尝试使用this示例,但无法正常工作。

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

像Sath建议的那样,foldleft起作用。

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