PySpark根据不同df的列过滤df的最佳方法';s

PySpark根据不同df的列过滤df的最佳方法';s,pyspark,Pyspark,我有一个DFa_DF,其中有两列,分别是COND_B和COND_C。然后我有两个不同的dfB_-df和C_-df列 现在我想过滤A_DF,其中一个或另一个中的值匹配。比如: df = A_DF.filter((A_DF.COND_B == B_DF.COND_B) | (A_DF.COND_C == C_DF.COND_C)) 但我发现这样是不可能的 编辑 错误:架构中缺少属性CON#B#264,COND#C#6:[…COND#B#532,COND#C#541]。操作中出现同名属性:COND_

我有一个DF
a_DF
,其中有两列,分别是
COND_B
COND_C
。然后我有两个不同的df
B_-df
C_-df

现在我想过滤
A_DF
,其中一个或另一个中的值匹配。比如:

df = A_DF.filter((A_DF.COND_B == B_DF.COND_B) | (A_DF.COND_C == C_DF.COND_C))
但我发现这样是不可能的

编辑 错误:
架构中缺少属性CON#B#264,COND#C#6:[…COND#B#532,COND#C#541]。操作中出现同名属性:COND_B、COND_C。请检查是否使用了正确的属性看起来我只能在同一个DF上过滤,因为动态添加了#号

因此,我首先尝试从
B_-DF
C_-DF
中列出一个列表,并在此基础上使用过滤器,但在100万条记录上使用
collect()
太贵了

所以我试着:

AB_DF = A_DF.join(B_DF, 'COND_B', 'left_semi')
AC_DF = A_DF.join(C_DF, 'COND_C', 'left_semi')

df = AB_DF.unionAll(AC_DF).dropDuplicates()
dropDuplicates()
我过去常常删除两个条件都为true的重复记录。尽管如此,我还是得到了一些意想不到的结果

是否有其他更平滑的解决方案可以简单地做到这一点?SQL中是否存在类似于
的语句

编辑2 我尝试了基于@mck响应的SQL:

e.createOrReplaceTempView('E')
b.createOrReplaceTempView('B')
p.createOrReplaceTempView('P')

df = spark.sql("""select * from E where exists (select 1 from B where E.BUSIPKEY = B.BUSIPKEY) or exists (select 1 from P where E.PCKEY = P.PCKEY)""")

my_output.write_dataframe(df)
有误:

Traceback (most recent call last):
  File "/myproject/abc.py", line 45, in my_compute_function
    df = spark.sql("""select * from E where exists (select 1 from B where E.BUSIPKEY = B.BUSIPKEY) or exists (select 1 from P where E.PCKEY = P.PCKEY)""")
TypeError: sql() missing 1 required positional argument: 'sqlQuery'

非常感谢

您使用
的想法已经存在
应该可行。你可以做:

A_DF.createOrReplaceTempView('A')
B_DF.createOrReplaceTempView('B')
C_DF.createOrReplaceTempView('C')

df = spark.sql("""
    select * from A 
    where exists (select 1 from B where A.COND_B = B.COND_B) 
    or exists (select 1 from C where A.COND_C = C.COND_C)
""")

出现了什么错误?我从未在pyspark中使用过sql查询。但我现在尝试了以下错误:`TypeError:sql()缺少1个必需的位置参数:`sqlQuery'`在我看来,在
sql()
中需要2个参数,不是吗?您似乎没有正确地将查询传递给spark.sql()。你能展示一下你在编辑问题时使用的代码吗?是的,请检查上面你的
spark
是如何定义的?它是像中那样定义的吗?