approxQuantile在Spark(Scala)中给出错误的中位数?

时间:2017-03-08 10:52:59

标签: 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.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)

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

3 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分: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)

答案 2 :(得分:0)

当尝试将 var _winflag1 = WindowManagerFlags.Fullscreen; var _window = this.Window; //_window is always null _window.AddFlags(_winflag1); 与roxQuantile()方法一起使用时,我遇到了类似的问题。当我升级到Spark-2.2.1时,roximateQuantile()现在返回正确的精确中位数。