在 PYSPARK 中旋转数据框
Posted
技术标签:
【中文标题】在 PYSPARK 中旋转数据框【英文标题】:Pivoting Data-frame in PYSPARK 【发布时间】:2018-01-01 09:28:33 【问题描述】:我有如下要求
数据框
id code
R101,GTR001
R201,RTY987
R301,KIT158
R201,PLI564
R101,MJU098
R301,OUY579
每个id
可以有多个code
s(不仅仅是两个)。
预期的输出应该如下。
id col1 col2 col3 col4 col5 col6
R101 GTR001 MJU098 null null null null
R201 null null RTY987 PLI564 null null
R301 null null null null KIT158 OUY579
此处特定id
的列取决于分配给id
的code
s 的数量,即在col1
和col2
下R101
的代码应填充,在col3
和@ 下应填充 R201
的 987654334@ 代码,其余 id 也是如此。
【问题讨论】:
How to pivot DataFrame?的可能重复 让我们continue this discussion in chat。 可以一样code
,例如GTR001
,分配给两个或多个id
s?
没有 Jacek,代码是唯一的
【参考方案1】:
您可以尝试根据 id 对代码字段进行排名,并使用排名进行透视。希望这会有所帮助,
df = spark.createDataFrame([('R101','GTR001'),('R201','RTY987'),('R301','KIT158'),('R201','PLI564'),('R101','MJU098'),('R301','OUY579')],['id','code'])
df.show()
+----+------+
| id| code|
+----+------+
|R101|GTR001|
|R201|RTY987|
|R301|KIT158|
|R201|PLI564|
|R101|MJU098|
|R301|OUY579|
+----+------+
from pyspark.sql import functions as F
from pyspark.sql import Window
df = df.withColumn('rank',F.dense_rank().over(Window.orderBy("id","code")))
df.withColumn('combcol',F.concat(F.lit('col_'),df['rank'])).groupby('id').pivot('combcol').agg(F.first('code')).show()
+----+------+------+------+------+------+------+
| id| col_1| col_2| col_3| col_4| col_5| col_6|
+----+------+------+------+------+------+------+
|R101|GTR001|MJU098| null| null| null| null|
|R201| null| null|PLI564|RTY987| null| null|
|R301| null| null| null| null|KIT158|OUY579|
+----+------+------+------+------+------+------+
【讨论】:
以上是关于在 PYSPARK 中旋转数据框的主要内容,如果未能解决你的问题,请参考以下文章
在 PySpark Dataframe 中结合旋转和分组聚合