scala - 如何将 Window 函数应用于 DataFrame 中的多个列
问题描述
我有以下 DataFrame df
:
Id label field1 field2
1 xxx 2 3
1 yyy 1 5
2 aaa 0 10
1 zzz 2 6
对于每个独特的Id
我想知道label
最高field1
和field2
。
预期结果:
Id labelField1 lableLield2
1 xxx zzz
2 aaa aaa
如果我只有labelField1
or ,我知道该怎么做labelField2
。但我不确定处理这两个标签的最佳方法是什么。
val w1 = Window.partitionBy($"Id").orderBy($"field1".desc)
val w2 = Window.partitionBy($"Id").orderBy($"field2".desc)
val myLabels = df.select("Id", "label", "field1", "field2")
.withColumn("rn", row_number.over(w1)).where($"rn" === 1)
.drop("rn")
.drop("field1")
解决方案
您可以组合struct
和max
内置功能来实现您的要求
import org.apache.spark.sql.functions._
df.groupBy("Id")
.agg(max(struct("field1", "label")).as("temp1"), max(struct("field2", "label")).as("temp2"))
.select(col("Id"), col("temp1.label").as("labelField1"), col("temp2.label").as("labelField2"))
.show(false)
这应该给你
+---+-----------+-----------+
|Id |labelField1|labelField2|
+---+-----------+-----------+
|1 |xxx |zzz |
|2 |aaa |aaa |
+---+-----------+-----------+
注意:如果Id=1中的平局,则两者之间存在平局,因此将选择随机field1
xxx
zzz
推荐阅读
- javascript - 使用firebase云函数监听后台变化
- android - 使用java编码android studio设置项目可见xml
- mysql - 根据 2 个键更新 post_meta 值 - Wordpress
- vba - VBA时跳过循环
- angular - 来自客户端问题的基于角度角色的保护
- ios - 快速比较时间
- android - 我收到消息“一些错误!” 当通过 PayPal 支付 Google 应用内购买时
- math - 3D Mesh:如何检测 Surface/Mesh 是否根据投影平面折叠
- java - 检测方法执行链中的任何方法是否使用特定注释进行了注释
- java - JOLT JSON 转换未按预期工作