/ / Harmonic Mean na Spark DataFrames w Scala - scala, apache-iskra, apache-spark-sql

Średnia harmoniczna na Spark DataFrames w Scala - scala, apache-spark, apache-spark-sql

Próbuję obliczyć Średnia harmoniczna dla kolumny DataFrame ze Spark w Scali.

Średnia harmoniczna jest zdefiniowana jako następująca, jak dla wprowadź opis obrazu tutaj :

wprowadź opis obrazu tutaj

Użyłem drugiej równości, aby zdefiniować funkcję średniej harmonicznej w następujący sposób:

// 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")))

lub:

df.count / df.rdd.map{ case r : Row => val i = r.getAs[Double]("_1"); (1.0 / i)}.sum

Ale zastanawiałem się, czy może być lepsze podejście do tego.

Odpowiedzi:

2 dla odpowiedzi № 1

Nie używałbym UDF ani w ogóle nie zbierałbym danych. Zamiast tego możesz rozwiązać ten problem używając tylko wbudowanych funkcji i podstawowych wyrażeń:

def harmonic(c: Column) = count(c) / sum(lit(1.0) / c)
df.select(harmonic($"_1").alias("H")).show

// +------------------+
// |                 H|
// +------------------+
// |1.7142857142857142|
// +------------------+