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

时间:2019-05-06 02:19:39

标签: scala apache-spark rdd

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

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]

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

2 个答案:

答案 0 :(得分:2)

与Spark无关。编译器会提示您-Array [Any]没有.mean()方法,因为它要求Array的元素必须为数字。

这意味着它可以是Double或Ints数组。

number.take(5)返回了Array [Any],因为您不能保证Array仅包含数字元素。

如果不能提供保证,则必须映射该数组并将所有这些值显式转换为您选择的Double或其他数字类型。

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可能会失败并引发异常。相反,我们可以将其包装为Try并转换为Option-如果出现异常,我们将得到None,并且由于flatMap而将这个值从均值的计算中跳过

答案 1 :(得分:0)

如果您愿意转换为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