Это не связано с Spark.Компилятор дает вам подсказку - для Array [Any] нет метода .mean (), потому что он требует, чтобы элементы Array были Numeric.
Это означает, что это сработало бы, если бы это был массив двойных или целых чисел.
number.take(5)
вернул массив [любой], потому что где-то над ним вы не давали никаких гарантий, что массив будет содержать только числовые значения.elements.
Если вы не можете предоставить эту гарантию, вам нужно отобразить этот массив и явно привести все эти значения к типу 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