解释一下Spark的approxQuantile函数和percentile_approx得到的结果之间的区别

问题描述 投票:0回答:1

当我运行下面的代码时,我得到了结果: 分位数

segments =WrappedArray(-27.0, 2.0, 4443.0)
,显示中位数为 2.0

  val quantiles = dfQuestions
    .stat
    .approxQuantile("score",Array(0,0.5,1.0),0.25)
  println(s"Quantiles segments =${quantiles.toSeq}")

分位数

segments =WrappedArray(-27.0, 2.0, 4443.0)

当我使用

percentile_approx(score, 0.25)
时,我得到了相同的结果。谁能告诉我为什么这里用的是
0.25
,而不是
0.5

dfQuestions.createOrReplaceTempView("so_questions")
  sparkSession.sql("select min(score), percentile_approx(score, 0.25), max(score) from so_questions").show()
apache-spark hive
1个回答
0
投票

首先,当我尝试类似于您的代码时,我收到错误:

NameError: name 'Array' is not defined

用括号 [] 替换你的 Array() 是有效的,尽管我删除了你的第一个参数 0,因为这产生了:

Py4JJavaError: An error occurred while calling o257.approxQuantile.
: java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.Double

这很奇怪,因为 pyspark.sql.DataFrame.approxQuantile()Apache Spark 网页 表明 probabilities 参数捕获最小值为 0。也许这是一个版本控制问题。

无论如何,这有效:

dfQuestions.stat.approxQuantile("score", [0.5,1.0], 0.25)

尽管如此,假设

approxQuantile()
percentile_approx()
均按预期运行,则 0.25 百分位数和 0.5 百分位数(中位数)可能相同。例如,它们在这个包含 12 个值的列表中是等效的:

0, 0, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4

0.25 百分位数是第四个值 = 2(低于 2 的值的 1/3),0.5 百分位数位于第六 (2) 和第七 (2) 值之间,即 2,因为它们相等。

最后,我承认近似值可能无法按预期工作。我使用

percentile_approx()
获得了更准确的结果,即使 relativeError 参数为 0(精确计算),而不是
approxQuantile()
的 0.25。 “精确计算”的不准确是没有意义的。我可能在某个地方犯了未知的错误。

我在 SQL 行中使用

percentile_approx()

score_quantile = sqlContext.sql("select percentile_approx(score, 0.25) as \
approx25Quantile from dfQuestions")
score_quantile.show()
© www.soinside.com 2019 - 2024. All rights reserved.