在 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
尝试了很多东西,但我不知道该怎么做。
感谢您的帮助。
您可以使用解析函数 rank
或 row_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|
#+--------+----------+--------------+
我有一个包含以下列和值的 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
尝试了很多东西,但我不知道该怎么做。
感谢您的帮助。
您可以使用解析函数 rank
或 row_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|
#+--------+----------+--------------+