我如何根据组对行进行配对?
how I can pair rows with respect of a group?
如何将每一行的元素配对成一个组?
id title comp
1 'A' 45
1 'B' 32
1 'C' 1
2 'D' 5
2 'F' 6
输出:
如果他们有相同的行,我想配对 'id'
output:
id title comp
1 'A','B' 45,32
1 'B','C' 32,1
2 'D','F' 5,6
使用window函数。收集目标列中直接连续元素的列表。通过使用 array_join 将结果数组转换为字符串来删除数组括号。最后一行将有更少的元素。过滤掉列表中少于 0ne 个元素的地方。
from pyspark.sql.functions import *
from pyspark.sql import Window
win=Window.partitionBy().orderBy(F.asc('title')).rowsBetween(0,1)
df.select("id", *[F.array_join(F.collect_list(c).over(win),',').alias(c) for c in df.drop('id').columns]).filter(length(col('comp'))>1).show()
+---+-----+-----+
| id|title| comp|
+---+-----+-----+
| 1| A,B|45,32|
| 1| B,C| 32,1|
| 1| C,D| 1,5|
| 2| D,F| 5,6|
+---+-----+-----+
如何将每一行的元素配对成一个组?
id title comp
1 'A' 45
1 'B' 32
1 'C' 1
2 'D' 5
2 'F' 6
输出:
如果他们有相同的行,我想配对 'id'
output:
id title comp
1 'A','B' 45,32
1 'B','C' 32,1
2 'D','F' 5,6
使用window函数。收集目标列中直接连续元素的列表。通过使用 array_join 将结果数组转换为字符串来删除数组括号。最后一行将有更少的元素。过滤掉列表中少于 0ne 个元素的地方。
from pyspark.sql.functions import *
from pyspark.sql import Window
win=Window.partitionBy().orderBy(F.asc('title')).rowsBetween(0,1)
df.select("id", *[F.array_join(F.collect_list(c).over(win),',').alias(c) for c in df.drop('id').columns]).filter(length(col('comp'))>1).show()
+---+-----+-----+
| id|title| comp|
+---+-----+-----+
| 1| A,B|45,32|
| 1| B,C| 32,1|
| 1| C,D| 1,5|
| 2| D,F| 5,6|
+---+-----+-----+