如何在Scala -Apache Spark中的数组中找到值的平均值



我有一个值数组,如下所示:

scala> number.take(5)
res1: Array[Any] = Array(908.76, 901.74, 83.71, 39.36, 234.64)

我需要使用RDD方法找到数组的平均值。

我尝试使用number.mean((方法,但它一直给我带来以下错误:

error: could not find implicit value for parameter num: Numeric[Any]

我是新手,请提供一些建议。谢谢。

与火花无关。编译器为您提供了提示 - 阵列[任何]没有.mean((方法,因为它要求数组的元素必须是数字。

这意味着如果是双重或ints的数组,则可以工作。

number.take(5)返回的数组[任何],因为在其上方的某个地方,您不能保证数组仅包含数字元素。

如果您无法提供该保证,则必须映射该数组,并明确地将所有这些值施放为您选择的双重或其他数字类型。

implicit class AnyExtended(value: Any) {
  def toDoubleO: Option[Double] = {
    Try(value.toDouble).toOption
  }
}
val array: Array[Double] = number.take(5).flatMap(_.toDoubleO)
val mean: Double = array.mean

请注意,而不是使用基本.toDouble我写了隐式分机,因为.toDouble可能会失败并抛出异常。取而代之的是,我们可以将其包裹在尝试转变为Option-如果例外,我们将获得None,并且该值将从flatMap

的均值计算中跳过。

如果您乐于转换为DF,那么Spark将以最小的努力为您做到这一点。

val number = List(908.76, 901.74, 83.71, 39.36, 234.64)
val numberRDD = sc.parallelize(number)
numberRDD.toDF("x").agg(avg(col("x")))
res1.show

这将产生答案433.642

最新更新