【问题标题】:How to perform division operation in dataFrame Spark using Scala?如何使用 Scala 在 dataFrame Spark 中执行除法运算?
【发布时间】:2017-11-13 12:30:24
【问题描述】:

我有一个类似下面的数据框。

+---+---+-----+
|uId| Id| sum |
+---+---+-----+
|  3|  1|  1.0|
|  7|  1|  1.0|
|  1|  2|  3.0|
|  1|  1|  1.0|
|  6|  5|  1.0|

使用上面的DataFrame,我想生成下面提到的新DataFrame Sum 列应该是:-

例如:

For uid=3 and id=1, my sum column value should be  (old sum value  * 1 / count of ID(1)) I.e.
1.0*1/3=0.333

For uid=7 and id=1, my sum column value should be  (old sum value  * 1 / count of ID(1)) I.e.
1.0*1/3=0.333

For uid=1 and id=2, my sum column value should be  (old sum value  * 1 / count of ID(1)) I.e.
3.0*1/1=3.0

For uid=6 and id=5, my sum column value should be  (old sum value  * 1 / count of ID(1)) I.e.
1.0*1/1=1.0

我的最终输出应该是:

+---+---+---------+
|uId| Id|  sum    |
+---+---+---------+
|  3|  1|  0.33333|     
|  7|  1|  0.33333| 
|  1|  2|  3.0    |
|  1|  1|  0.3333 |
|  6|  5|  1.0    |

【问题讨论】:

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


    【解决方案1】:

    您可以使用Window 函数来获取每组id 列的count,最后使用该计数除以原始sum

    import org.apache.spark.sql.expressions.Window
    val windowSpec = Window.partitionBy("id")
    
    import org.apache.spark.sql.functions._
    df.withColumn("sum", $"sum"/count("id").over(windowSpec))
    

    你应该有最后的dataframe

    +---+---+------------------+
    |uId|Id |sum               |
    +---+---+------------------+
    |3  |1  |0.3333333333333333|
    |7  |1  |0.3333333333333333|
    |1  |1  |0.3333333333333333|
    |6  |5  |1.0               |
    |1  |2  |3.0               |
    +---+---+------------------+
    

    【讨论】:

      猜你喜欢
      • 2019-03-20
      • 2021-05-08
      • 1970-01-01
      • 2017-06-12
      • 1970-01-01
      • 2015-12-03
      • 2021-06-28
      • 1970-01-01
      • 2019-10-22
      相关资源
      最近更新 更多