PySpark根据不同df的列过滤df的最佳方法';s
我有一个DFPySpark根据不同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_
a_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_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
是如何定义的?它是像中那样定义的吗?