我有一个超过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示例,但无法正常工作。
答案 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))}