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 中做到这一点?
用于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)