近似分位数在Spark(Scala)中给出的中值不正确?

近似分位数在Spark(Scala)中给出的中值不正确?,scala,apache-spark,Scala,Apache Spark,我有以下测试数据: 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.

我有以下测试数据:

 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)

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

这是我的本地测试结果。你做过类似的事情吗

 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)
请注意,这是一个近似的分位数计算。它不应该总是给你准确的答案。有关更详细的解释,请参阅


原因是,对于非常大的数据集,有时你可以给出一个近似的答案,只要你得到的答案比精确的计算要快得多。

我在尝试将approxQuantile()方法与
Spark-2.2.1
结合使用时遇到了类似的问题。当我升级到Spark-2.4.3时,approxQuantile()现在返回正确的精确中值。

Hmm,奇怪。另一个版本,但仍然不是69.5335。我已经将所有源添加到我的问题中。但在文档中,它们说明了relativeError—要达到的相对目标精度(>=0)。如果设置为零,则会计算出精确的分位数。我也有同样的问题。关于如何解决这个问题,有什么建议吗?@Nimi,我记得我已经用自己的udf解决了这个问题。你介意分享一下吗?我不知道如何使用udf聚合列的值。我想保留spark中的计算,而不是提取值。