You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PySpark DataFrame透视转换问题:如何获取目标格式结果?

解决PySpark键值对DataFrame转宽表问题

你的原始DataFrame是键值对格式(每行是一个字段名和对应值),每11行对应一个租户的完整数据。要转成每行对应一个租户、列为字段名的宽表,需先给每个租户的分组添加标识,再进行透视,步骤如下:

步骤1:添加租户分组标识

因为数据是按租户顺序连续排列的,每个租户固定11个字段,所以用monotonically_increasing_id()生成连续ID,再通过整除11得到每个租户的唯一分组ID:

from pyspark.sql.functions import monotonically_increasing_id, expr

# 添加分组ID,每11条数据为一个租户组
df_with_group = df.withColumn("group_id", (monotonically_increasing_id() // 11).cast("int"))

步骤2:按分组ID透视转换

以group_id分组,透视name字段(字段名),聚合取每个分组内的第一个rows值(因为每个分组内每个字段名唯一):

pivoted_df = df_with_group.groupBy("group_id") \
    .pivot("name") \
    .agg(expr("first(rows)")) \
    .drop("group_id")  # 可选:不需要分组ID则删除

验证结果

执行后pivoted_df的结构就是每行对应一个租户,列包含TenantId、TimeGenerated等所有字段名,值为对应租户的属性值。

原代码不符合预期的原因

原代码用groupBy("name")是按字段名分组,每个字段名单独成组,透视后虽然列是字段名,但行还是每个字段一行,完全不符合“每行一个租户”的需求。必须先按租户的分组维度(这里是连续的11条数据组)来分组,才能正确透视。

内容的提问来源于stack exchange,提问作者coding

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 22:45:19