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数据框:对一列求和,同时对另一列进行分组的主要内容,如果未能解决你的问题,请参考以下文章