【问题标题】:Filter values while using pyspark collect list使用 pyspark 收集列表时过滤值
【发布时间】:2020-07-07 00:13:32
【问题描述】:

我有以下 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 中实现这一点?

【问题讨论】:

    标签: dataframe apache-spark pyspark


    【解决方案1】:

    如果数组大小>1,您可以从Spark-2.4使用array_remove函数。

    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]                  |
    #+--------+---------------------+
    

    【讨论】:

    • 谢谢..使用数组删除功能,它按预期工作。
    猜你喜欢
    • 1970-01-01
    • 2018-03-24
    • 1970-01-01
    • 2016-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-27
    相关资源
    最近更新 更多