PySpark:组内的Groupby,并根据某些值在单独的字段中显示总和

mzsu5hc0  于 2023-10-15  发布在  Spark
关注(0)|答案(1)|浏览(94)

我有一个包含公司名称,EmpId,奖金和工资的邮箱。
| 公司|EMPID|奖金|工资|
| --|--|--|--|
| 苹果| 1234 |没有| 5 |
| 苹果| 1235 |没有| 7 |
| 谷歌| 6786 |是的| 6 |
| 谷歌| 6787 |没有| 5 |
| 谷歌| 6788 |没有| 6 |
| 目标| 9091 |是的| 4 |
| 目标| 9092 |是的| 1 |
| 目标| 9093 |是的| 9 |
| 目标| 9094 |没有| 2 |
| 目标| 9094 |是的| 4 |
我想按公司名称分组,无论EmpIds和创建2个不同的列,将显示奖金和工资总额由公司收到。
预期输出:
| 公司|TOT_AMT_NO_BONUS|总计_奖金|
| --|--|--|
| 苹果| 12 | 0 |
| 谷歌| 11 | 6 |
| 目标| 2 | 18 |
已尝试groupBy、Aggregate和Sum,但未获得预期结果。如果有人能帮忙,我很感激。先谢了。

9jyewag0

9jyewag01#

您可以按公司分组,以奖金为中心,对工资进行求和,然后将任何空条目填充为0:

sparkDF.groupby('COMPANY').pivot('BONUS').sum('salary').withColumnRenamed(
    'No', 'TOT_AMT_NO_BONUS',
).withColumnRenamed(
    'Yes', 'TOTAL_BONUS'
).fillna(
    value=0, subset=['TOT_AMT_NO_BONUS','TOTAL_BONUS']
)

+-------+----------------+-----------+
|COMPANY|TOT_AMT_NO_BONUS|TOTAL_BONUS|
+-------+----------------+-----------+
|  APPLE|              12|          0|
| TARGET|               2|         18|
| GOOGLE|              11|          6|
+-------+----------------+-----------+

相关问题