使用pyspark collect list时筛选值

5vf7fwbs  于 2021-05-27  发布在  Spark
关注(0)|答案(1)|浏览(547)

我有下面的pysparkDataframe。

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

我使用groupby聚合数据,collect set收集数据,删除重复值,并创建以下输出。

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]

有没有办法在Pypark中实现这一点?

eh57zj3b

eh57zj3b1#

Spark-2.4 你可以用 array_remove 如果数组大小>1,则函数。 Example: ```
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] |

+--------+---------------------+

相关问题