Pyspark 收集列表

Pad*_*123 3 dataframe apache-spark pyspark

我正在 pyspark 数据框中的一列上进行分组,并在另一列上执行收集列表以获取 column_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
Run Code Online (Sandbox Code Playgroud)

我得到的输出是列_2 的收集列表,其中列_1 分组。

Column_1 Column_2
A        [Name1,Name2,Name3]  
B        [Name1,Name2]
C        [Name1]
D        [Name1,Name1,Name1,Name1]
Run Code Online (Sandbox Code Playgroud)

现在,当收集列表中的所有值都相同时,我只想仅显示一次而不是四次。以下是预期输出。

预期输出:

Column_1 Column_2
A        [Name1,Name2,Name3]  
B        [Name1,Name2]
C        [Name1]
D        [Name1]
Run Code Online (Sandbox Code Playgroud)

有没有办法在 pyspark 中做到这一点?

Shu*_*Shu 6

用于collect_set消除重复项并使用array_sort(来自 Spark-2.4.0)对数组进行排序。

  • (或)使用array_distinct(From Spark-2.4.0)从collect_list中消除重复项。

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]              |
#+--------+---------------------+
Run Code Online (Sandbox Code Playgroud)