首页 > 解决方案 > 我如何制作一个关于组的列对?

问题描述

我有一个数据框和一个id列作为一个组。对于每个id我想通过以下方式配对它的元素:

title     id
sal        1
summer     1
fada       1
row        2
winter     2
gole       2
jack       3
noway      3

输出

title     id     pair
sal        1      None
summer     1      summer,sal
fada       1      fada,summer
row        2      None
winter     2      winter, row
gole       2      gole,winter
jack       3      None
noway      3      noway,jack

正如您在输出中看到的那样,我们从 group 的最后一个元素id与它上方的一个元素配对。由于该组的第一个元素没有我放的对None。我还应该提到,这可以pandas通过以下代码完成,但我需要Pyspark代码,因为我的数据很大。

df=data.assign(pair=data.groupby('id')['title'].apply(lambda x: x.str.cat(x.shift(1),sep=',')))

                    |

标签: apache-sparkpysparkgroup-byapache-spark-sql

解决方案


我不能再强调 Spark 数据框是一个无序的行集合,所以说“它上面的元素”之类的东西是未定义的,没有要排序的列。您可以使用 伪造订单F.monotonically_increasing_id(),但我不确定这是否是您想要的。

from pyspark.sql import functions as F, Window

w = Window.partitionBy('id').orderBy(F.monotonically_increasing_id())

df2 = df.withColumn(
    'pair', 
    F.when(
        F.lag('title').over(w).isNotNull(),
        F.concat_ws(',', 'title', F.lag('title').over(w))
    )
)

df2.show()
+------+---+-----------+
| title| id|       pair|
+------+---+-----------+
|   sal|  1|       null|
|summer|  1| summer,sal|
|  fada|  1|fada,summer|
|  jack|  3|       null|
| noway|  3| noway,jack|
|   row|  2|       null|
|winter|  2| winter,row|
|  gole|  2|gole,winter|
+------+---+-----------+

推荐阅读