如何在多列场景下使用Group By与Sum且不重命名列
解决Spark分组求和后保留原列名的问题
方法1:动态生成聚合表达式(推荐,适配多列场景)
先筛选出除uid外的所有需要聚合的列,为每列生成sum(col).alias(col)的聚合表达式,再传入agg方法:
from pyspark.sql.functions import sum, col # 获取非uid的列列表,生成带别名的sum表达式 agg_exprs = [sum(col(col_name)).alias(col_name) for col_name in df.columns if col_name != "uid"] # 执行分组聚合 result_df = df.groupBy("uid").agg(*agg_exprs)
这种方式无需手动编写数百个列名,自动适配任意数量的列,执行后列名与原DataFrame完全一致。
方法2:对分组结果重命名列
如果已经执行了groupBy.sum(),可以通过字符串替换重命名列:
# 先执行默认分组求和 temp_df = df.groupBy("uid").sum() # 批量重命名列:移除sum()包裹 new_col_names = ["uid"] + [col_name.replace("sum(", "").replace(")", "") for col_name in temp_df.columns if col_name != "uid"] result_df = temp_df.toDF(*new_col_names)
注意:如果原列名包含括号,这种字符串替换会出错,因此方法1更稳妥。
测试结果验证
用你提供的示例数据执行上述方法后,输出结果如下:
uid sel_type1 sel_type2 sel_type3 123 2 1 1 100 0 1 2
内容的提问来源于stack exchange,提问作者Gumada Yaroslav
相关产品推荐
相关产品推荐

