Scala中Spark DataFrames的调和均值

时间:2016-01-22 13:38:56

标签: scala apache-spark apache-spark-sql

我尝试使用Scala中的Spark计算DataFrame列的 Harmonic Mean

谐波均值的定义如下:[{3}}:

enter image description here

我使用了第二个相等来定义谐波均值函数如下:

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

或:

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

但我想知道是否有更好的方法可以做到这一点。

1 个答案:

答案 0 :(得分:2)

我根本不会使用UDF或收集数据。相反,您可以仅使用内置函数和基本表达式来解决此问题:

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

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