Dataframe 使用pyspark收集列表时筛选值

Dataframe 使用pyspark收集列表时筛选值,dataframe,apache-spark,pyspark,Dataframe,Apache Spark,Pyspark,我有下面的pyspark数据框 Column_1 Column_2 A Name1 A Name2 A Name3 A X B Name1 B X B Name2 C Name1 D Name1 D Name1 D Name1 D Name1 E X 我使用group by聚合数据并收集集合来收集数据并删除重复值,

我有下面的pyspark数据框

Column_1 Column_2
A        Name1
A        Name2
A        Name3
A        X
B        Name1
B        X
B        Name2
C        Name1
D        Name1
D        Name1
D        Name1
D        Name1
E        X
我使用group by聚合数据并收集集合来收集数据并删除重复值,并创建以下输出

Column_1 Column_2
A        [Name1,Name2,Name3,X]  
B        [Name1,X,Name2]
C        [Name1]
D        [Name1]
E        [X]
但我期望的输出是每当X与其他值(如Name1、Name2等)一起出现时。它必须从输出集中删除(行A、B)。但是,只要它是行的唯一值,就必须像行E一样保留它

预期产出:

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

pyspark中是否有实现此目的的方法?

Spark-2.4
如果数组大小>1,则可以使用
数组移除功能

示例:

df.show(10,False)
#+--------+------------------------+
#|Column_1|Column_2                |
#+--------+------------------------+
#|A       |[Name1, Name2, Name3, X]|
#|E       |[X]                     |
#+--------+------------------------+

from pyspark.sql.functions import *
df.withColumn("Column_2",when(size(col("Column_2")) > 1 , array_remove(col("column_2"),'X')).otherwise(col("column_2"))).show(10,False)

#using filter function
df.withColumn("Column_2",when(size(col("Column_2")) > 1 , expr("filter(column_2, x -> not(x <=> 'X'))")).otherwise(col("column_2"))).show(10,False)
#+--------+---------------------+
#|Column_1|Column_2             |
#+--------+---------------------+
#|A       |[Name1, Name2, Name3]|
#|E       |[X]                  |
#+--------+---------------------+
df.show(10,False)
#+--------+------------------------+
#|第1列|第2列|
#+--------+------------------------+
#|A |[Name1,Name2,Name3,X]|
#|E |[X]|
#+--------+------------------------+
从pyspark.sql.functions导入*
df.with Column(“Column_2”),当(size(col(“Column_2”))>1时,数组_移除(col(“Column_2”),'X')。否则(col(“Column_2”)。显示(10,False)
#使用过滤函数
df.withColumn(“Column_2”),当(size(Column(“Column_2”))>1时,expr(“filter(Column_2,x->not(x'x')”)。否则(col(“Column_2”))。显示(10,False)
#+--------+---------------------+
#|第1列|第2列|
#+--------+---------------------+
#|A |[Name1,Name2,Name3]|
#|E |[X]|
#+--------+---------------------+

谢谢。。使用了array remove函数,并按预期工作。