在 PySpark 中获取多个分组依据的最大值

Get max value of multiple group by in PySpark

我有一个包含以下列和值的 pyspark 数据框:

|employee|department|salary|
+--------+----------+------+
|   James|     Sales| 90000|
| Michael|     Sales| 86000|
|  Robert|     Sales| 81000|
|   Maria|   Finance| 90000|
|   Raman|   Finance| 99000|
|   Scott|   Finance| 83000|
|    Jeff| Marketing| 80000|
|   Kumar| Marketing| 91000|
|   Sarah| Marketing| 95000|

我想要一个数据帧,其中 employee 每个 department 最高 salary

所以我的结果将是:

|employee|department|highest salary|
+--------+----------+---------------+
|   James|     Sales|         90000|
|   Raman|   Finance|         99000|
|   Sarah| Marketing|         95000|

我已经用 groupby 尝试了很多东西,但我不知道该怎么做。

感谢您的帮助。

您可以使用解析函数 rankrow_number

df = df.withColumn('rank', F.expr('rank() over (partition by department order by salary desc)')) \
    .filter('rank=1').drop('rank')
df.show(truncate=False)

您可以在结构列上使用 group by 和 max 来获得最高的 salary by department 以及关联的 employee,如下所示:

import pyspark.sql.functions as F

result = df.groupBy("department") \
    .agg(F.max(F.struct("salary", "employee")).alias("max")) \
    .selectExpr("max.employee", "department", "max.salary as highest_salary")

result.show()
#+--------+----------+--------------+
#|employee|department|highest_salary|
#+--------+----------+--------------+
#|   Raman|   Finance|         99000|
#|   Sarah| Marketing|         95000|
#|   James|     Sales|         90000|
#+--------+----------+--------------+