Estoy tratando de calcular el Significado armonico para una columna DataFrame con Spark en Scala.
La media armónica se define como seguida tal como para :
He usado la segunda igualdad para definir la función de media armónica de la siguiente manera:
// Organize imports
import org.apache.spark.sql.{Column,DataFrame}
import org.apache.spark.sql.functions._
// Define inverse UDF
def inverse = udf[Double,Double](d => (1.toDouble / d))
// Define Harmonic Mean function
def harmonicMean(df : DataFrame, column : Column) : Double = {
df.count / df.withColumn("inverse",inverse(column)).
agg(sum("inverse")).first.getAs[Double](0)
}
// Example :
val df = sc.parallelize(Seq(1,2,4)).toDF
println("H = " + harmonicMean(df,df("_1")))
o:
df.count / df.rdd.map{ case r : Row => val i = r.getAs[Double]("_1"); (1.0 / i)}.sum
Pero me preguntaba si podría haber un mejor enfoque para hacerlo.
Respuestas
2 para la respuesta № 1No utilizaría UDF ni recopilaría ningún tipo de información. En su lugar, puede resolver esto utilizando solo las funciones integradas y las expresiones básicas:
def harmonic(c: Column) = count(c) / sum(lit(1.0) / c)
df.select(harmonic($"_1").alias("H")).show
// +------------------+
// | H|
// +------------------+
// |1.7142857142857142|
// +------------------+