首页 > 解决方案 > pyspark:isIN 和 isNOT IN 替换为另一个 df 列

问题描述

我正在尝试使用“isin”过滤 pyspark 中的数据帧,还尝试了另一种过滤方式。

无法得到正确的结果。得到 Spark Array 文字的错误。谁能帮忙

One way:

df1.select("COL1").distinct().show()
df2.select(('col1').isin(df1.select("COL1").distinct()))

-------
Second way :

uniquelist=df1.select("COL1").distinct().collect()
df2.filter(F.col('col1').contains(uniqueVIN)).show()

谁能帮我解决错误:

调用 z:org.apache.spark.sql.functions.lit 时出错。

我还要表演一个“不在”

data_array =  np.array(df_list.select("f_col").collect())
df_filtered = df_2.filter(~df_2["colname"].isin([data_array]))

标签: dataframepysparkpyspark-dataframes

解决方案


collect()返回Row对象列表,您需要先从行中获取值,然后再将其传递给isin列方法:

unique_list = [r["COL1"] for r in df1.select("COL1").distinct().collect()]

df2.filter(F.col('col1').isin(unique_list)).show()

但是,您应该为此使用 join :

  • 用于left_semi从 中获取df2相应行的行df1

    df2.join(df1, df1["COL1"] == df2["col1"], "left_semi").show()
    
  • left_anti从中获取df2没有对应值的行df1

    df2.join(df1, df1["COL1"] == df2["col1"], "left_anti").show()
    

推荐阅读