如何用pyspark对多行数值进行groupby求和?

1 人关注

下面是一个Pyspark数据框架,我需要用groupby来求和行的值。

load_dt|org_cntry|sum(srv_curr_vo_qty_accs_mthd)|sum(srv_curr_bb_qty_accs_mthd)|sum(srv_curr_tv_qty_accs_mthd)|
+-------------------+---------+------------------------------+------------------------------+------------------------------+
|2021-12-06 00:00:00|     null|                           NaN|                           NaN|                           NaN|
|2021-12-06 00:00:00|   PANAMA|                      360126.0|                      214229.0|                      207950.0|

1.groupby(load_dt,org_cntry)

2.行值之和(sum(srv_curr_vo_qty_accs_mthd)|sum(srv_curr_bb_qty_accs_mthd)|sum(srv_curr_tv_qty_accs_mthd)|

load_dt     org_cntry   total_sum
2021-12-06  Panama       782305
    
2 个评论
你能不能补充一下预期的输出是什么?
是的,我添加了预期的输出。基本上,它应该根据groupby条件添加行的值
apache-spark
pyspark
apache-spark-sql
Pavithra Kannan
Pavithra Kannan
发布于 2021-12-07
2 个回答
Steven
Steven
发布于 2021-12-07
0 人赞同

只需将你的结果相加(+)。

from pyspark.sql import functions as F
df.groupBy("load_dt", "org_cntry").agg(
        F.sum("srv_curr_vo_qty_accs_mthd")
        + F.sum("srv_curr_bb_qty_accs_mthd")
        + F.sum("srv_curr_tv_qty_accs_mthd")
    ).alias("total_sum")
    
'DataFrame'对象没有'groupBy'属性,我得到这个错误
我已经尝试了上述代码,但我得到了上述错误。你能帮助我吗 @Steven
groupBy 是数据框架的一个方法......所以我不明白为什么你有这个错误......
@PavithraKannan 你使用的是pandas数据框架还是spark数据框架?
谢谢你@steve,它起作用了
notNull
notNull
发布于 2021-12-07
已采纳
0 人赞同

在这种情况下使用Spark2.4+高阶函数。

Example:

#sample dataframe
#+-------------------+---------+--------+--------+--------+
#|            load_dt|org_cntry|      s1|      s2|      s3|
#+-------------------+---------+--------+--------+--------+
#|2021-12-06 00:00:00|   PANAMA|360126.0|214229.0|207950.0|
#+-------------------+---------+--------+--------+--------+
#create array from sum columns then add all the array elements.
df.selectExpr("*", "AGGREGATE(array(s1,s2,s3), cast(0 as double), (x, y) -> x + y) total_sum").show()
#using withColumn
df.withColumn("total_sum", expr("AGGREGATE(array(s1,s2,s3), cast(0 as double), (x, y) -> x + y)")).show()
#+-------------------+---------+--------+--------+--------+---------+