代码之家  ›  专栏  ›  技术社区  ›  user3243499

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

  •  -1
  • user3243499  · 技术社区  · 7 年前

    我有一个Spark数据帧,如下所示:

    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 价值

    1 回复  |  直到 7 年前
        1
  •  1
  •   Shaido MadHadders    7 年前

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

    可通过以下方式解决:

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