我有一个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中执行这些聚合?
答案 0 :(得分:1)
添加依赖于数据组/分区的其他列时,使用窗口函数很方便。在这种情况下,您可以使用窗口函数来计算在F3
列上分区的所有F1
值的总和。
可以解决以下问题:
val w = Window.partitionBy("F1")
val df2 = df.withColumn("F4", $"F3" / sum($"F3").over(w))