Pyspark如何将同ID多行按rank字段转换为单ID多列宽表
你需要的是典型的行转列(长表转宽表)操作,在PySpark中可以通过groupBy+pivot组合实现,代码如下:
from pyspark.sql.functions import first # 1. 核心转换逻辑:按id分组,以rank为维度做行转列 df_pivot = df.groupBy("id") \ # 如果rank的取值固定为1/2/3,建议传第二个参数指定取值列表,大幅提升运行性能 .pivot("rank", [1,2,3]) \ .agg( first("pred").alias("pred"), first("prob").alias("prob") ) # 2. 重命名列名,适配要求的pred_1、prob_1格式 final_cols = [] for col_name in df_pivot.columns: if col_name == "id": final_cols.append(col_name) else: rank_num, field = col_name.split("_") final_cols.append(f"{field}_{rank_num}") df_result = df_pivot.toDF(*final_cols) # 查看输出结果 df_result.show()
运行后输出结果和你要求的目标格式完全一致,缺失的rank对应位置会默认填充null,如果你需要替换为空字符串,可以额外用when函数做值替换即可。
内容的提问来源于stack exchange,提问作者Deb
相关产品推荐
相关产品推荐

