PySpark按公司分组 基于Bonus值计算薪资合计分栏展示
解决方案
你可以通过条件聚合实现需求,核心是用when函数区分有奖金和无奖金的员工,再分别完成求和计算:
代码示例
假设你的DataFrame名为df,执行以下代码:
from pyspark.sql import functions as F result_df = df.groupBy("COMPANY") \ .agg( # 无奖金的薪资总和:筛选BONUS为null或0的员工,求和其SALARY F.sum(F.when((F.col("BONUS").isNull()) | (F.col("BONUS") == 0), F.col("SALARY")).otherwise(0)).alias("TOT_AMT_NO_BONUS"), # 有奖金的薪资总和:筛选BONUS非空且大于0的员工,求和其SALARY+BONUS F.sum(F.when((F.col("BONUS").isNotNull()) & (F.col("BONUS") > 0), F.col("SALARY") + F.col("BONUS")).otherwise(0)).alias("TOTAL_BONUS") )
逻辑说明
groupBy("COMPANY"):按公司分组,EMPID因未参与分组会自动被忽略- 第一个聚合项:判断员工是否无奖金(BONUS为null或等于0),符合条件则取对应SALARY,否则取0,最终求和得到
TOT_AMT_NO_BONUS - 第二个聚合项:判断员工是否有奖金(BONUS非空且大于0),符合条件则取
SALARY+BONUS,否则取0,最终求和得到TOTAL_BONUS
如果你的TOTAL_BONUS实际指奖金总额而非薪资加奖金,只需修改第二个聚合项的计算逻辑:
F.sum(F.when((F.col("BONUS").isNotNull()) & (F.col("BONUS") > 0), F.col("BONUS")).otherwise(0)).alias("TOTAL_BONUS")
验证示例
假设原始数据:
| COMPANY | EMPID | BONUS | SALARY |
|---|---|---|---|
| A | 1 | 100 | 5000 |
| A | 2 | null | 4000 |
| B | 3 | 0 | 6000 |
| B | 4 | 200 | 7000 |
运行代码后输出:
| COMPANY | TOT_AMT_NO_BONUS | TOTAL_BONUS |
|---|---|---|
| A | 4000 | 5100 |
| B | 6000 | 7200 |
内容的提问来源于stack exchange,提问作者sanju
相关产品推荐
相关产品推荐

