如何有效地将每个值除以同一组中的值之和?

时间:2018-11-07 09:19:56

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

我有一个Spark DataFrame,如下所示:

F1  F2  F3
x   y   n1
x   z   n2
x   a   n3
x   b   n4
t   y   n5
t   y2  n6
t   y3  n7
t   y4  n8

对于每一行,我想使用另一个字段F4创建另一个数据框,如下所示:

F1  F2  F3  F4
x   y   n1  n1/(n1+2+n3+n4)
x   z   n2  n2/(n1+2+n3+n4)
x   a   n3  n3/(n1+2+n3+n4)
x   b   n4  n4/(n1+2+n3+n4)
t   y   n5  n5/(n5+n6+n7+n8)
t   y2  n6  n6/(n5+n6+n7+n8)
t   y3  n7  n7/(n5+n6+n7+n8)
t   y4  n8  n8/(n5+n6+n7+n8)

也就是说,每个F3应除以F3值相同的F1之和。

如何在Spark Scala中执行这些聚合?

1 个答案:

答案 0 :(得分:1)

添加依赖于数据组/分区的其他列时,使用窗口函数很方便。在这种情况下,您可以使用窗口函数来计算在F3列上分区的所有F1值的总和。

可以解决以下问题:

val w = Window.partitionBy("F1")
val df2 = df.withColumn("F4", $"F3" / sum($"F3").over(w))