Pyspark中位数和分位数

时间:2019-05-16 02:17:44

标签: python apache-spark pyspark apache-spark-sql pyspark-sql

在我的数据框中,我有一个年龄列。行的总数约为770亿。我想使用PySpark计算该列的分位数。我有一些代码,但是计算时间很长(也许我的过程很糟糕)。

有什么好的方法可以改善这一点吗?

数据框示例:

id       age
1         18
2         32
3         54
4         63
5         42
6         23

到目前为止我所做的:

#Summary stats
df.describe('age').show()

#For Quantile values
x5 = df.approxQuantile("age", [0.5], 0)
x25 = df.approxQuantile("age", [0.25], 0)
x75 = df.approxQuantile("age", [0.75], 0)

1 个答案:

答案 0 :(得分:0)

首先要做的就是同时进行所有分位数的计算:

quantiles = df.approxQuantile("age", [0.25, 0.5, 0.75], 0)

此外,请注意,您将使用精确的分位数计算。从documentation我们可以看到(我加了强调):

  

relativeError –要达到的相对目标精度(> = 0)。如果设置为零,则会计算精确分位数,这可能非常昂贵。请注意,可接受大于1的值,但结果与1相同。

由于您的数据帧非常大,我希望在这些计算中可以接受一些误差,但这将是速度和精度之间的权衡(尽管任何大于0的速度都可以显着提高速度)。