Как найти среднее значение в массиве в Scala - Apache Spark - PullRequest
0 голосов
/ 06 мая 2019

У меня есть массив значений, как показано ниже:

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 ]

2 голосов
/ 06 мая 2019

Это не связано с 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

0 голосов
/ 06 мая 2019

Если вы счастливы перейти на 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

...