Pyspark:在groupBy之后删除列条件中的行

Pyspark:在groupBy之后删除列条件中的行,pyspark,apache-spark-sql,Pyspark,Apache Spark Sql,这是我的输入数据帧: id val 1 Y 1 N 2 a 2 b 3 N 结果应该是: id val 1 Y 2 a 2 b 3 N 我想按列id分组,该列在val中同时包含Y和N,然后删除列val包含“N”的行。 请帮助我解决此问题,因为我是pyspark的初学者您可以首先使用val==“Y”的筛选器识别有问题的行,然后将此数据帧连接回原始数据帧。最后,您可以筛选Null值和要保留的行,例如val==Y。Pyspark应该能够处理自连接

这是我的输入数据帧:

id val    
1  Y
1  N
2  a
2  b
3  N
结果应该是:

id val    
1  Y     
2  a    
2  b
3  N
我想按列id分组,该列在val中同时包含Y和N,然后删除列val包含“N”的行。
请帮助我解决此问题,因为我是pyspark的初学者

您可以首先使用
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|
+---+---+

您在数据帧上运行什么转换?您能给我们提供更多的上下文吗?我想按列id分组,然后删除列val包含“N”的行。为什么不直接使用筛选器删除这些行?为什么需要分组?我只想在特定id同时具有val Y和N时删除该行。如果id 3只有val“N”那么它就不应该删除id为3的行。在包含100万条记录的数据框中,可能会有这么多id,其中有2行或多行。那么,在这种情况下,您将如何应用筛选条件呢?非常感谢您提供的解决方案,但如果同一id有两个以上的值,则该解决方案不起作用。例如,如果id 1有四个值(Y、N、X、Z)df_new=spark.createDataFrame([(1,“Y”),(1,“N”),(1,“X”),(1,“Z”),(3,“N”),(“id”,“val”))在这种情况下,您可以只更新过滤器:让最后一部分不是
val==“Y”
,而是
val!=“N”
我将更新答案