在我的数据框中,我有一个年龄列。行的总数约为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)
答案 0 :(得分:0)
首先要做的就是同时进行所有分位数的计算:
quantiles = df.approxQuantile("age", [0.25, 0.5, 0.75], 0)
此外,请注意,您将使用精确的分位数计算。从documentation我们可以看到(我加了强调):
relativeError –要达到的相对目标精度(> = 0)。如果设置为零,则会计算精确分位数,这可能非常昂贵。请注意,可接受大于1的值,但结果与1相同。
由于您的数据帧非常大,我希望在这些计算中可以接受一些误差,但这将是速度和精度之间的权衡(尽管任何大于0的速度都可以显着提高速度)。