首页 > 解决方案 > 如何在 PySpark DataFrame 中的 GroupBy 和聚合之后传递第三方列?

问题描述

我有一个 Spark DataFrame,比如说df,我需要对其应用一个 GroupBy col1,通过最大值聚合col2并传递对应的值col3(这与 groupBy 或聚合无关)。最好用一个例子来说明它。

df.show()

+-----+-----+-----+
| col1| col2| col3|
+-----+-----+-----+
|    1|  500|  10 |
|    1|  600|  11 |
|    1|  700|  12 |
|    2|  600|  14 |
|    2|  800|  15 |
|    2|  650|  17 |
+-----+-----+-----+

我可以很容易地执行groupBy和聚合以获得每个组的最大值col2,使用

import pyspark.sql.functions as F

df1 = df.groupBy("col1").agg(
    F.max("col2").alias('Max_col2')).show()

+-----+---------+
| col1| Max_col2|
+-----+---------+
|    1|      700|
|    2|      800|
+-----+---------+

但是,我正在努力并且想要做的是另外传递 的相应值col3,从而获得下表:

+-----+---------+-----+
| col1| Max_col2| col3|
+-----+---------+-----+
|    1|      700|  12 |
|    2|      800|  15 |
+-----+---------+-----+

有谁知道如何做到这一点?

提前谢谢了,

马里安萨斯

标签: pythonapache-sparkpysparkapache-spark-sql

解决方案


您可以聚合一个结构的最大值,然后扩展该结构:

import pyspark.sql.functions as F

df2 = df.groupBy('col1').agg(
    F.max(F.struct('col2', 'col3')).alias('col')
).select('col1', 'col.*')

df2.show()
+----+----+----+
|col1|col2|col3|
+----+----+----+
|   1| 700|  12|
|   2| 800|  15|
+----+----+----+

推荐阅读