apache-spark - 将窗口函数应用于多列
问题描述
我有一个超过 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行这样的。有没有办法使用更少的代码来做到这一点?我尝试使用这个示例,但它不起作用。
解决方案
检查下面的代码,它比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)
推荐阅读
- google-chrome-extension - 内容脚本与谷歌浏览器扩展上的其他内容脚本通信的更短方式?
- python - 这个 TypeError 来自哪里?(将肌动蛋白用于恒星活动指数)类型错误:预期的 str、字节或 os.PathLike 对象,而不是 bool
- python - 在装饰器函数中返回包装器
- python - Python Flask CSRF 会话令牌丢失(Chrome Web 浏览器)
- elasticsearch - Elasticsearch-7.8.1 在短语建议期间间歇性地显示随机建议
- react-native - 在 SDK 40 上反应本机博览会警告
- r - 比较矩阵中数据的有效方法
- python - 如何在多个选举程序中打印多个获胜者?
- apache-camel - 在 Camel 3 中使用 Jasypt 属性解析器
- vue-component - 在 vue.js 中的子组件中渲染对象数组