Pyspark数据框:对一列求和,同时对另一列进行分组

Posted

技术标签:

【中文标题】Pyspark数据框:对一列求和,同时对另一列进行分组【英文标题】:Pyspark dataframe: Summing over a column while grouping over another 【发布时间】:2015-11-27 16:57:50 【问题描述】:

我有一个如下的数据框

In [94]: prova_df.show()


order_item_order_id order_item_subtotal
1                   299.98             
2                   199.99             
2                   250.0              
2                   129.99             
4                   49.98              
4                   299.95             
4                   150.0              
4                   199.92             
5                   299.98             
5                   299.95             
5                   99.96              
5                   299.98             

我想做的是为第一列的每个不同值计算第二列对应值的总和。 我尝试使用以下代码执行此操作:

from pyspark.sql import functions as func
prova_df.groupBy("order_item_order_id").agg(func.sum("order_item_subtotal")).show()

输出结果

SUM('order_item_subtotal)
129.99000549316406       
579.9500122070312        
199.9499969482422        
634.819995880127         
434.91000747680664 

我不太确定它是否做对了。 为什么它不显示第一列的信息? 提前感谢您的回答

【问题讨论】:

【参考方案1】:

为什么不显示第一列的信息?

很可能是因为您使用的是过时的 Spark 1.3.x。如果是这种情况,您必须在 agg 中重复分组列,如下所示:

(df
    .groupBy("order_item_order_id")
    .agg(func.col("order_item_order_id"), func.sum("order_item_subtotal"))
    .show())

【讨论】:

【参考方案2】:

使用 PySpark 2.7.x 的类似解决方案如下所示:

df = spark.createDataFrame(
    [(1, 299.98),
    (2, 199.99),
    (2, 250.0),
    (2, 129.99),
    (4, 49.98),
    (4, 299.95),
    (4, 150.0),
    (4, 199.92),
    (5, 299.98),
    (5, 299.95),
    (5, 99.96),
    (5, 299.98)],
    ['order_item_order_id', 'order_item_subtotal'])

df.groupBy('order_item_order_id').sum('order_item_subtotal').show()

这会导致以下输出:

+-------------------+------------------------+
|order_item_order_id|sum(order_item_subtotal)|
+-------------------+------------------------+
|                  5|       999.8700000000001|
|                  1|                  299.98|
|                  2|                  579.98|
|                  4|                  699.85|
+-------------------+------------------------+

【讨论】:

【参考方案3】:

您可以在窗口函数中使用分区:

from pyspark.sql import Window

df.withColumn("value_field", f.sum("order_item_subtotal") \
  .over(Window.partitionBy("order_item_order_id"))) \
  .show()

【讨论】:

这里的 value_field 是什么? 只是一个您希望列命名的任意字符串

以上是关于Pyspark数据框:对一列求和,同时对另一列进行分组的主要内容,如果未能解决你的问题,请参考以下文章

如何对另一列的分组中的一列求和?

窗口函数:仅对另一列中的不同值求和

如何按一列分组并对另一列的值进行排序?

Pyspark如何将一列与数据框中另一列的结果相乘?

如何通过 Pyspark 中同一数据框中另一列的正则表达式值过滤数据框中的一列

SQL - 更新表,以便在给定另一列的键的情况下对一列求和