如何将Window函数应用于DataFrame中的多个列

时间:2018-06-07 12:09:36

标签: scala apache-spark apache-spark-sql

我有以下DataFrame df

Id   label   field1   field2
1    xxx     2        3
1    yyy     1        5
2    aaa     0        10
1    zzz     2        6

对于每个唯一Id,我想知道label field1field2 Id labelField1 lableLield2 1 xxx zzz 2 aaa aaa

预期结果:

labelField1

如果我只有labelField2val 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}}

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因此将选择随机