Dataframe Pypark收集列表
我在pyspark数据帧中的一列上进行分组,并在另一列上进行收集列表,以获取列_1的所有可用值。如下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_
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)对数组进行排序
- (或)使用
(来自Spark-2.4.0)从收集列表中消除重复项array\u distinct
除了我的上述评论之外,如果顺序按发生顺序重要(请检查输入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] |
+--------+---------------------+