Pyspark isin与参数中的列不排除行

时间:2019-07-18 11:13:02

标签: pyspark pyspark-sql

我需要排除“状态”列中没有True值的行。

在我看来,这个filter(isin()== False)结构应该可以解决我的问题,但是不能。

df = sqlContext.createDataFrame([( "A", "True"), ( "A", "False"), ( "B", "False"), ("C",  "True")], ( "name", "status")) 
df.registerTempTable("df")
df_t = df[df.status == "True"]

from pyspark.sql import functions as sf

df_f = df.filter(df.status.isin(df_t.name)== False)

我希望排:

B | False

非常感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

首先,我认为在您的最后一条语句中,您打算使用df.name而不是df.status

df_f = df.filter(df.status.isin(df_t.name)== False)

第二,即使您使用df.name,也仍然无法使用。 因为它混合了两个DataFrame中的列(列类型),即最终声明中的df_tdf。我认为这在pyspark中不起作用。 但是,您可以使用其他方法达到相同的效果。 如果我理解正确,则要先通过“状态”列选择“ A”和“ C”,然后选择[[A],“ C”]以外的行。这里的事情是将选择范围扩展到“ A”的第二行,这可以通过Window来实现。见下文:

from pyspark.sql import functions as F
from pyspark.sql.window import Window

df = sqlContext.createDataFrame([( "A", "True"), ( "A", "False"), ( "B", "False"), ("C",  "True")], ( "name", "status")) 
df.registerTempTable("df")
# create an auxiliary column satisfying the condition
df = df.withColumn("flag", F.when(df['status']=="True", 1).otherwise(0))
df.show()
# extend the selection to other rows with the same 'name'
df = df.withColumn('flag', F.max(df['flag']).over(Window.partitionBy('name')))
df.show()
#filter is now easy
df_f = df.filter(df.flag==0)
df_f.show()