首页 > 解决方案 > Pyspark:在groupBy之后删除列条件上的行

问题描述

这是我的输入数据框:

id val    
1  Y
1  N
2  a
2  b
3  N

结果应该是:

id val    
1  Y     
2  a    
2  b
3  N

我想在 val 中同时包含 Y 和 N 的 col id 上进行分组,然后删除列 val 包含“N”的行。请帮我解决这个问题,因为我是 pyspark 的初学者

标签: pysparkapache-spark-sql

解决方案


您可以首先使用过滤器识别有问题的行,val=="Y"然后将此数据框连接回原始数据框。最后,您可以过滤Null值和要保留的行,例如val==Y. 即使有很多行,Pyspark 也应该能够处理自联接。示例如下所示:

df_new = spark.createDataFrame([
(1, "Y"), (1, "N"), (1,"X"), (1,"Z"),
(2,"a"), (2,"b"), (3,"N")
], ("id", "val"))

df_Y = df_new.filter(col("val")=="Y").withColumnRenamed("val","val_Y").withColumnRenamed("id","id_Y")
df_new = df_new.join(df_Y, df_new["id"]==df_Y["id_Y"],how="left")
df_new.filter((col("val_Y").isNull()) | ((col("val_Y")=="Y") & ~(col("val")=="N"))).select("id","val").show()

结果将是您的首选:

+---+---+
| id|val|
+---+---+
|  1|  X|
|  1|  Y|
|  1|  Z|
|  3|  N|
|  2|  a|
|  2|  b|
+---+---+

推荐阅读