Dataframe 使用pyspark收集列表时筛选值
我有下面的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聚合数据并收集集合来收集数据并删除重复值,
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函数,并按预期工作。