首页 > 解决方案 > 使用 Pyspark 聚合两列

问题描述

通过 PySpark 学习 Apache Spark 并遇到问题。

我有以下DF:

+----------+------------+-----------+----------------+
|   game_id|posteam_type|total_plays|total_touchdowns|
+----------+------------+-----------+----------------+
|2009092003|        home|         90|               3|
|2010091912|        home|         95|               0|
|2010112106|        home|         75|               0|
|2010121213|        home|         85|               3|
|2009092011|        null|          9|            null|
|2010110703|        null|          2|            null|
|2010112111|        null|          6|            null|
|2011100909|        home|        102|               3|
|2011120800|        home|         72|               2|
|2012010110|        home|         74|               6|
|2012110410|        home|         68|               1|
|2012120911|        away|         91|               2|
|2011103008|        null|          6|            null|
|2012111100|        null|          3|            null|
|2013092212|        home|         86|               6|
|2013112407|        home|         73|               4|
|2013120106|        home|         99|               3|
|2014090705|        home|         94|               3|
|2014101203|        home|         77|               4|
|2014102611|        home|        107|               6|
+----------+------------+-----------+----------------+

我试图找到得分 TD 或 sum(total_plays)/sum(total_touchdowns) 所需的平均播放次数。

我想出了获得总和的代码,但无法弄清楚如何获得总平均值:

plays = nfl_game_play.groupBy().agg({'total_plays': 'sum'}).collect()
touchdowns = nfl_game_play.groupBy().agg({'total_touchdowns',: 'sum'}).collect()

如您所见,我尝试将每个值存储为变量,但不仅仅是记住每个值是什么并手动执行它。

标签: apache-sparkpyspark

解决方案


试试下面的代码:

Example:

df.show()
#+-----------+----------------+
#|total_plays|total_touchdowns|
#+-----------+----------------+
#|         90|               3|
#|         95|               0|
#|          9|            null|
#+-----------+----------------+

from pyspark.sql.functions import *
total_avg=df.groupBy().agg(sum("total_plays")/sum("total_touchdowns")).collect()[0][0]
#64.66666666666667

推荐阅读