如何计算 RDD[Long] 的标准差和平均值?
Posted
技术标签:
【中文标题】如何计算 RDD[Long] 的标准差和平均值?【英文标题】:How to calculate standard deviation and average values of RDD[Long]? 【发布时间】:2018-01-07 16:22:05 【问题描述】:我将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
【问题讨论】:
【参考方案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
它使用与stdev
和mean
相同的内部结构,但只需扫描一次数据。
我推荐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()
【讨论】:
以上是关于如何计算 RDD[Long] 的标准差和平均值?的主要内容,如果未能解决你的问题,请参考以下文章