【问题标题】:How to calculate standard deviation and average values of RDD[Long]?如何计算 RDD[Long] 的标准差和平均值?
【发布时间】:2023-03-12 11:15:01
【问题描述】:

我将RDD[Long] 称为mod,我想使用 Spark 2.2 和 Scala 2.11.8 计算此 RDD 的标准差和平均值。

我该怎么做?

我尝试如下计算平均值,但有没有更简单的方法来获得这些值?

val avg_val = mod.toDF("col").agg(
    avg($"col").as("avg")
).first().toString().toDouble

val stddev_val = mod.toDF("col").agg(
    stddev($"col").as("avg")
).first().toString().toDouble

【问题讨论】:

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


    【解决方案1】:

    我有一个叫做 mod 的 RDD[Long],我想计算标准差和平均值

    只需使用stats:

    scala> val mod = sc.parallelize(Seq(1L, 3L, 5L))
    mod: org.apache.spark.rdd.RDD[Long] = ParallelCollectionRDD[0] at parallelize at <console>:24
    
    scala> val stats = mod.stats
    stats: org.apache.spark.util.StatCounter = (count: 3, mean: 3.000000, stdev: 1.632993, max: 5.000000, min: 1.000000)
    
    scala> stats.mean
    res0: Double = 3.0
    
    scala> stats.stdev
    res1: Double = 1.632993161855452
    

    它使用与stdevmean 相同的内部结构,但只需扫描一次数据。

    我推荐Dataset

    val (avg_val, stddev_val) = mod.toDS
      .agg(mean("value"), stddev("value"))
      .as[(Double, Double)].first
    

    import org.apache.spark.sql.Row
    
    val Row(avg_val: Double, stddev_val: Double) = mod.toDS
      .agg(mean("value"), stddev("value"))
      .first
    

    但在这里既没有必要也没有用。

    【讨论】:

      【解决方案2】:

      我认为这很简单:

      mod.stdev()
      mod.mean()
      

      【讨论】:

        最近更新 更多