如何有效地计算pyspark中的平均值和标准差

Posted

技术标签:

【中文标题】如何有效地计算pyspark中的平均值和标准差【英文标题】:How to efficiently calculate average and standard deviation in pyspark 【发布时间】:2020-09-21 12:49:17 【问题描述】:

我有一个这样的数据集:

df
+-----------------+---------+----------+---+
|part-id     |    msgid| date     |duration|
+-----------------+---------+----------+---
|RDZ0L2227686|      743|2020-07-02|    2593|
|RDZ0L2227686|      734|2020-07-01|       4|
|RDZ0L2227687|      742|2020-07-02|       3|
|RDZ0L2227687|      737|2020-07-02|     669|
|RDZ0L2227687|      738|2020-07-02|    1099|
|RDZ0L2227687|      733|2020-07-01|      50|
|RDZ0L2227688|      740|2020-07-02|    5924|
|JTZ0L2227688|      741|2020-07-02|    8199|
|JTZ0L2227688|      739|2020-07-02|     190|
|RDZ0L2227688|      736|2020-07-02|    1841|
|RDZ0L2227689|      735|2020-07-02|    2173|
|JTZ0L2227686|      744|2020-07-02|     482|

我想计算持续时间列的平均值和标准差,并将这两列添加到输入数据框中。所以最终的df.columns 应该是:date,mean,standdev 假设我应用了df.cache() 并且df 是一个非常大的数据框,我就是这样做的:

df1 =   df.groupBy('date').agg(F.mean("duration")).agg(F.stddev("duration"))
df2 =   df.groupBy('date').agg(F.mean("duration")).agg(F.mean("duration"))
df3 =  join(df1,df2) on date #columns `date,mean,stddev`

df = join(df,df3) on date #columns `date,mean,stddev`

能否请您帮忙,以便我可以在一行中计算平均值和标准差,而不是调用 df 两次并以更有效的方式完成整个事情?

【问题讨论】:

【参考方案1】:

假设您的数据框 df 具有以下架构和行

df.printSchema()
df.show()

您可以在一行中获得所需的用例

df.groupBy('date').agg(F.mean("duration"),F.stddev("duration")).show()

【讨论】:

以上是关于如何有效地计算pyspark中的平均值和标准差的主要内容,如果未能解决你的问题,请参考以下文章

如何有效地计算运行标准偏差?

如何计算给定均值和标准差的正态分布中的概率?

如何计算按列名分组的数据框/矩阵中的平均值和标准差

运行或滑动中位数、平均值和标准差

如何根据随机分布数据计算 C++ 中的样本均值、标准差和方差,并与原始均值和 sigma 进行比较

PySpark 无法计算 Koalas DataFrame 中的按列标准差