2017-03-08 186 views
2

我有这样的测试数据:approxQuantile在Spark(Scala)中给出不正确的中位数?

val data = List(
     List(47.5335D), 
     List(67.5335D), 
     List(69.5335D), 
     List(444.1235D), 
     List(677.5335D) 
    ) 

我期待中位数为69.5335。 但是,当我试图找到确切的中位数与此代码:

df.stat.approxQuantile(column, Array(0.5), 0) 

它给我:444.1235

为什么会这样,以及它如何能解决吗?

我做这样的:

 val data = List(
     List(47.5335D), 
     List(67.5335D), 
     List(69.5335D), 
     List(444.1235D), 
     List(677.5335D) 
    ) 

     val rdd = sparkContext.parallelize(data).map(Row.fromSeq(_)) 
     val schema = StructType(Array(
     StructField("value", DataTypes.DoubleType, false) 
    )) 

     val df = sqlContext.createDataFrame(rdd, schema) 
     df.createOrReplaceTempView(tableName) 
val df2 = sc.sql(s"SELECT value FROM $tableName") 
val median = df2.stat.approxQuantile("value", Array(0.5), 0) 

所以我创建临时表。然后在里面搜索,然后计算结果。这只是为了测试。

回答

0

这是我本地的结果。你做类似的事吗?

val data = List(
     List(47.5335D), 
     List(67.5335D), 
     List(69.5335D), 
     List(444.1235D), 
     List(677.5335D) 
    ) 

val df = data.flatten.toDF 

df.stat.approxQuantile("value", Array(0.5), 0) 
// res18: Array[Double] = Array(67.5335) 
+0

嗯,奇怪。另一个版本,但仍然不是69.5335。我已将所有来源添加到我的问题中。 – user2975535

1

注意,这是一个近似位数计算。它不应该一直给你确切的答案。有关更详细的解释,请参见here

原因是,对于非常大的数据集,有时只要您的计算速度明显快于确切计算,您就可以用近似答案。

+4

但是在文档https://spark.apache.org/docs/2.0.2/api/java/org/apache/spark/sql/DataFrameStatFunctions.html#approxQuantile(java.lang.String,%20double [], %20double)他们声明** relativeError - 实现相对目标精度(> = 0)。如果设置为零,则计算确切的分位数** – user2975535

+0

我明白了。你可能想在问题中指出这一点。 – Amir

相关问题