在 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 可以有多个codes(不仅仅是两个)。

预期的输出应该如下。

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 的列取决于分配给idcodes 的数量,即在col1col2R101 的代码应填充,在col3 和@ 下应填充 R201 的 987654334@ 代码,其余 id 也是如此。

【问题讨论】:

How to pivot DataFrame?的可能重复 让我们continue this discussion in chat。 可以一样code,例如GTR001,分配给两个或多个ids? 没有 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 中结合旋转和分组聚合

使用 pyspark 将结构数组旋转到列中 - 不爆炸数组

在pyspark中旋转一行的值

PYSPARK:如何在 pyspark 数据框中找到两列的余弦相似度?

在 Pyspark 中旋转时无法解析列名

PySpark 旋转