Dataframe Pypark收集列表

Dataframe Pypark收集列表,dataframe,apache-spark,pyspark,Dataframe,Apache Spark,Pyspark,我在pyspark数据帧中的一列上进行分组,并在另一列上进行收集列表,以获取列_1的所有可用值。如下 Column_1 Column_2 A Name1 A Name2 A Name3 B Name1 B Name2 C Name1 D Name1 D Name1 D Name1 D Name1 我得到的输出是列_2的收集列表,列_1已分组 Column_

我在pyspark数据帧中的一列上进行分组,并在另一列上进行收集列表,以获取列_1的所有可用值。如下

Column_1 Column_2
A        Name1
A        Name2
A        Name3
B        Name1
B        Name2
C        Name1
D        Name1
D        Name1
D        Name1
D        Name1
我得到的输出是列_2的收集列表,列_1已分组

Column_1 Column_2
A        [Name1,Name2,Name3]  
B        [Name1,Name2]
C        [Name1]
D        [Name1,Name1,Name1,Name1]
现在,当collect列表中的所有值都相同时,我只想显示一次,而不是四次。以下是预期产出

预期输出:

Column_1 Column_2
A        [Name1,Name2,Name3]  
B        [Name1,Name2]
C        [Name1]
D        [Name1]

在pyspark中是否有这样做的方法?

使用
收集集
消除重复项,并使用
数组排序
(来自Spark-2.4.0)对数组进行排序

  • (或)使用
    array\u distinct
    (来自Spark-2.4.0)从收集列表中消除重复项


除了我的上述评论之外,如果顺序按发生顺序重要(请检查输入df):


选择
collect\u set
而不是
collect\u list
。。?或者秩序重要吗?是的。秩序实际上很重要。什么样的秩序是重要的?它是基于发生的吗?假设
Name1,Name3,Name2
是A组中的序列,那么根据发生顺序,预期输出是
Name1,Name2,Name3
还是
Name1,Name3,Name2
Its。名称1、名称2、名称3应保持不变
df.show()
#+--------+--------+
#|Column_1|Column_2|
#+--------+--------+
#|       A|   Name1|
#|       A|   Name2|
#|       A|   Name3|
#|       B|   Name1|
#|       B|   Name2|
#|       C|   Name1|
#|       D|   Name1|
#|       D|   Name1|
#+--------+--------+

from pyspark.sql.functions import *    
df.groupBy('Column_1').agg(array_sort(collect_set(col('Column_2'))).alias("Column_2")).orderBy("Column_1").show(10,False)

#using array_distinct,array_sort functions   
df.groupBy('Column_1').agg(array_sort(array_distinct(collect_list(col('Column_2')))).alias("Column_2")).orderBy("Column_1").show(10,False)
#+--------+---------------------+
#|Column_1|Column_2             |
#+--------+---------------------+
#|A       |[Name1, Name2, Name3]|
#|B       |[Name1, Name2]       |
#|C       |[Name1]              |
#|D       |[Name1]              |
#+--------+---------------------+
+--------+--------+
|Column_1|Column_2|
+--------+--------+
|A       |Name1   |
|A       |Name3   | <-Name3 occurs first
|A       |Name2   |
|B       |Name1   |
|B       |Name2   |
|C       |Name1   |
|D       |Name1   |
|D       |Name1   |
|D       |Name1   |
|D       |Name1   |
+--------+--------+
(df.withColumn("idx",F.monotonically_increasing_id()).dropDuplicates(["Column_1","Column_2"])
.orderBy("idx").groupby("Column_1").agg(F.collect_list("Column_2").alias("Column_2"))
 .orderBy("Column_1")).show(truncate=False)

+--------+---------------------+
|Column_1|Column_2             |
+--------+---------------------+
|A       |[Name1, Name3, Name2]|
|B       |[Name1, Name2]       |
|C       |[Name1]              |
|D       |[Name1]              |
+--------+---------------------+