我有以下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
如果我只有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")
,我知道怎么做。
但我不确定处理这两种标签的最佳方法是什么。
{{1}}
答案 0 :(得分:1)
您可以合并SELECT sport, count(*)
FROM activities
WHERE username IN ('tony')
GROUP BY 1;
和struct
inbuild函数来满足您的要求
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)
注意:如果 tie 与 Id = 1 的+---+-----------+-----------+
|Id |labelField1|labelField2|
+---+-----------+-----------+
|1 |xxx |zzz |
|2 |aaa |aaa |
+---+-----------+-----------+
一样,{{>> 之间存在 tie 1}}和field1
因此将选择随机