如何将PySpark DataFrame转换为指定的宽表格式?
解决Spark DataFrame长表转宽表的问题
嘿,我懂你想要把这个长格式DataFrame转换成指定宽格式的需求啦!其实Spark内置的pivot函数就是干这个的,你之前没接触过它很正常,咱们一步步来实现:
步骤1:创建目标列名字段
首先我们需要把str和num拼接成str_num格式的列名,这里要注意把num转成字符串类型,避免拼接时出现类型问题:
from pyspark.sql.functions import concat, lit, col # 添加新列存储拼接后的目标列名 df_with_col = df_spark.withColumn("col_name", concat(col("str"), lit("_"), col("num").cast("string")))
步骤2:分组+pivot转换格式
接下来通过groupBy按id分组,再用pivot把刚才生成的col_name字段的所有唯一值转成新的列,最后聚合取出对应的val值(你的数据里每个id+col_name组合只有一个val,用first聚合就足够):
# 执行分组、透视和聚合操作 result_df = df_with_col.groupBy("id").pivot("col_name").agg({"val": "first"}) # 查看结果 result_df.show()
执行后你就能得到想要的格式:
+---+-----+-----+-----+-----+-----+ | id|abc_1|abc_2|abc_3|def_3|def_9| +---+-----+-----+-----+-----+-----+ | 11| 114| 104| null| null| 113| | 12| 14| null| null| 110| null| | 14| 194| 164| 104| null| null| +---+-----+-----+-----+-----+-----+
(注:Spark里的null在显示效果上和你示例里的NaN等价,如果需要统一显示为NaN,可以后续用na.fill或者转换为Pandas DataFrame处理)
补充说明
如果你的数据里存在同一个id+col_name对应多个val的情况,可以把聚合函数换成sum、max等,根据实际需求选择合适的方式合并值。
内容的提问来源于stack exchange,提问作者Jonas
相关产品推荐
相关产品推荐

