【问题标题】:How to sum multiple row values with groupby using pyspark?如何使用pyspark将多行值与groupby相加?
【发布时间】:2022-01-12 13:49:45
【问题描述】:

下面给出的是一个 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 行值(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

【问题讨论】:

  • 您能补充一下预期的输出吗?
  • 是的,我添加了预期的输出。基本上它应该根据 groupby 条件添加行值

标签: apache-spark pyspark apache-spark-sql


【解决方案1】:

简单地求和(+)你的结果:

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 成功了
【解决方案2】:

在这种情况下使用 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()

#+-------------------+---------+--------+--------+--------+---------+
#|            load_dt|org_cntry|      s1|      s2|      s3|total_sum|
#+-------------------+---------+--------+--------+--------+---------+
#|2021-12-06 00:00:00|   PANAMA|360126.0|214229.0|207950.0| 782305.0|
#+-------------------+---------+--------+--------+--------+---------+

【讨论】:

  • 感谢您的回答
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-02-15
  • 2023-04-02
  • 2022-07-05
  • 1970-01-01
  • 2020-09-09
  • 2016-10-01
  • 1970-01-01
相关资源
最近更新 更多