PySpark数据帧转置为列表

PySpark数据帧转置为列表,pyspark,pyspark-sql,Pyspark,Pyspark Sql,我正在使用pyspark sql api,并尝试将具有重复值的行分组到剩余内容的列表中。它类似于转置,但不是旋转所有值,而是将值放入数组中 电流输出: group_id | member_id | name 55 | 123 | jake 55 | 234 | tim 65 | 345 | chris 期望输出: group_id | members 55 | [[123, 'jake'], [234, 't

我正在使用pyspark sql api,并尝试将具有重复值的行分组到剩余内容的列表中。它类似于转置,但不是旋转所有值,而是将值放入数组中

电流输出:

group_id | member_id | name
55       | 123       | jake
55       | 234       | tim 
65       | 345       | chris
期望输出:

group_id | members
55       | [[123, 'jake'], [234, 'tim']]
65       | [345, 'chris']

您需要
groupby
组id并用作聚合函数

至于组合
成员id
名称
列,您有两个选项:

备选案文1:使用:
从pyspark.sql.functions导入数组,收集\u列表
df1=df.groupBy(“组id”)\
.agg(收集列表(数组(“成员id”、“名称”))。别名(“成员”))
df1.show(truncate=False)
#+--------+-------------------------------------------------+
#|组id |成员|
#+--------+-------------------------------------------------+
#|55 |[WrappedArray(123,杰克),WrappedArray(234,蒂姆)]|
#|65 |[WrappedArray(345,克里斯)]|
#+--------+-------------------------------------------------+
这将返回字符串数组的
WrappedArray
。整数转换为字符串,因为不能使用混合类型数组

df1.printSchema()
#根
#|--group_id:integer(nullable=true)
#|--成员:数组(nullable=true)
#| |--元素:数组(containsnall=true)
#| | |--元素:字符串(containsnall=true)
备选案文2:使用
从pyspark.sql.functions导入收集列表,结构
df2=df.groupBy(“组id”)\
.agg(收集列表(结构(“成员id”、“名称”))。别名(“成员”))
df2.show(truncate=False)
#+--------+-----------------------+
#|组id |成员|
#+--------+-----------------------+
#|65 |[345,克里斯]|
#|55 |[123,杰克][234,蒂姆]]|
#+--------+-----------------------+
这将返回一个结构数组,其中包含
member\u id
name

df2.printSchema()
#根
#|--group_id:integer(nullable=true)
#|--成员:数组(nullable=true)
#| |--元素:struct(containsnall=true)
#| | |--成员id:integer(nullable=true)
#| | |--name:string(nullable=true)
struct方法的有用之处在于,您可以使用点访问器按名称访问嵌套数组的元素:

df2.select(“group\u id”、“members.member\u id”).show()
#+--------+----------+
#|组id |成员id|
#+--------+----------+
#|      65|     [345]|
#|      55|[123, 234]|
#+--------+----------+