当我运行下面的代码时,我得到了结果: 分位数
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()
首先,当我尝试类似于您的代码时,我收到错误:
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()