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

时间:2020-09-21 12:49:17

标签: python apache-spark pyspark

我有一个像这样的数据集:

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`

请帮忙,这样我就可以在一行中计算均值和stddev而不是两次调用df,从而以更有效的方式完成整个操作?

1 个答案:

答案 0 :(得分:1)

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

df.printSchema()
df.show()

enter image description here

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

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

enter image description here