我有一个值数组,如下所示:
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的新手,请提供一些建议。谢谢。
答案 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