Pyspark 中的中位数和分位数值

Nik*_*wal 3 python apache-spark apache-spark-sql pyspark

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

有什么好的方法可以改善这个情况吗?

数据框示例:

id       age
1         18
2         32
3         54
4         63
5         42
6         23
Run Code Online (Sandbox Code Playgroud)

到目前为止我所做的:

#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)
Run Code Online (Sandbox Code Playgroud)

Sha*_*ica 6

第一个改进是同时进行所有分位数计算:

\n\n
quantiles = df.approxQuantile("age", [0.25, 0.5, 0.75], 0)\n
Run Code Online (Sandbox Code Playgroud)\n\n

另请注意,您使用分位数的精确计算。从文档中我们可以看到(重点是我添加的):

\n\n
\n

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

\n
\n\n

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

\n