我有一个值数组,如下所示:
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