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
相关产品推荐
相关产品推荐

