我需要排除“状态”列中没有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
非常感谢您的帮助!
答案 0 :(得分:0)
首先,我认为在您的最后一条语句中,您打算使用df.name
而不是df.status
。
df_f = df.filter(df.status.isin(df_t.name)== False)
第二,即使您使用df.name
,也仍然无法使用。
因为它混合了两个DataFrame中的列(列类型),即最终声明中的df_t
和df
。我认为这在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()