近似分位数在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中的计算,而不是提取值。