¿Cómo puedo calcular la mediana exacta con Apache Spark?

Esta página contiene algunas funciones estadísticas (mean, stdev, varianza, etc.) pero no contiene la mediana. ¿Cómo puedo calcular la mediana exacta?

Gracias

Debe ordenar RDD y tomar elemento en el medio o promedio de dos elementos. Aquí hay un ejemplo con RDD [Int]:

import org.apache.spark.SparkContext._ val rdd: RDD[Int] = ??? val sorted = rdd.sortBy(identity).zipWithIndex().map { case (v, idx) => (idx, v) } val count = sorted.count() val median: Double = if (count % 2 == 0) { val l = count / 2 - 1 val r = l + 1 (sorted.lookup(l).head + sorted.lookup(r).head).toDouble / 2 } else sorted.lookup(count / 2).head.toDouble 

Usando Spark 2.0+ y la API de DataFrame puedes usar el método approxQuantile :

 def approxQuantile(col: String, probabilities: Array[Double], relativeError: Double) 

También funcionará en múltiples columnas al mismo tiempo desde Spark versión 2.2. Al establecer probabilites en Array(0.5) y relativeError en 0, calculará la mediana exacta. De la documentación :

La precisión del objective relativo a alcanzar (mayor o igual que 0). Si se establece en cero, se calculan los cuantiles exactos, lo que podría ser muy costoso.

A pesar de esto, parece haber algunos problemas con la precisión al establecer relativeError en 0, consulte la pregunta aquí . Un error bajo cercano a 0 en algunos casos funcionará mejor (dependerá de la versión de Spark).


Un pequeño ejemplo de trabajo que calcula la mediana de los números del 1 al 99 (ambos inclusive) y utiliza un error relativeError bajo:

 val df = (0 to 99).toDF("num") val median = df.stat.approxQuantile("num", Array(0.5), 0.001)(0) println(median) 

La mediana devuelta es 50.0.