Pyspark数据透视表并基于另一列的值创建新列

ivqmmu1c  于 2022-11-01  发布在  Spark
关注(0)|答案(1)|浏览(169)

我正在尝试根据另一个数据行的值建立现有数据行的新版本。例如,在输入中,我为'var 1'、'var 2'、'var 3'建立新数据行,以取得'var'分割可以取得的每个值。

输入:

| 计时器|学生|劈裂|变量1|变量2|变量3|
| - -|- -|- -|- -|- -|- -|
| t1通道|学生1| A级|一个|三个|七个|
| t1通道|学生1| B| 2个|五个|六个|
| t1通道|学生1| C类|三个|一个|九个|
| 第二次|学生1| A级|五个|三个|七个|
| 第二次|学生1| B|九个|六个|三个|
| 第二次|学生1| C类|三个|五个|三个|
| t1通道|学生2| A级|一个|2个|八个|
| t1通道|学生2| C类|七个|四个|第0页|

输出:

| 计时器|学生|拆分变量1|拆分变量2|拆分变量1|拆分B_var1|拆分B_var2|拆分B_var3|拆分C_var1|拆分C_var2|拆分C_var3|
| - -|- -|- -|- -|- -|- -|- -|- -|- -|- -|- -|
| t1通道|学生1|一个|三个|七个|2个|五个|六个|三个|一个|九个|
| 第二次|学生1|五个|三个|七个|九个|六个|三个|三个|五个|三个|
| t1通道|学生2|一个|2个|八个||||七个|四个|第0页|
Image of output here if table not formatted

6jygbczu

6jygbczu1#

这是一个简单的具有多个聚合的pivot(在agg()内)。
参见下面示例

import pyspark.sql.functions as func

data_sdf. \
    withColumn('pivot_col', func.concat(func.lit('split'), 'split')). \
    groupBy('time', 'student'). \
    pivot('pivot_col'). \
    agg(func.first('var1').alias('var1'), 
        func.first('var2').alias('var2'), 
        func.first('var3').alias('var3')
        ). \
    show()

# +----+--------+-----------+-----------+-----------+-----------+-----------+-----------+-----------+-----------+-----------+

# |time| student|splitA_var1|splitA_var2|splitA_var3|splitB_var1|splitB_var2|splitB_var3|splitC_var1|splitC_var2|splitC_var3|

# +----+--------+-----------+-----------+-----------+-----------+-----------+-----------+-----------+-----------+-----------+

# |  t1|Student2|          1|          2|          8|       null|       null|       null|          7|          4|          0|

# |  t2|Student1|          5|          3|          7|          9|          6|          3|          3|          5|          3|

# |  t1|Student1|          1|          3|          7|          2|          5|          6|          3|          1|          9|

# +----+--------+-----------+-----------+-----------+-----------+-----------+-----------+-----------+-----------+-----------+

spark将使用以下命名法创建新列- 〈数据透视列值〉_〈聚合别名〉

相关问题