PySpark AND EXISTS 等价于 sql 查询

Posted

技术标签:

【中文标题】PySpark AND EXISTS 等价于 sql 查询【英文标题】:PySpark AND EXISTS equivalent to sql query 【发布时间】:2020-07-23 12:48:59 【问题描述】:

我有以下 sql 查询,我需要在 pySpark 中得到相同的结果:

Select * 
From FIRSTKEY o 
Where o.INCRNR=123456
And exists ( 
select 1 
from SECONDKEY b 
where o.ID = b.ID 
and o.IPDAT = b.IPDAT            
and b.INCRNR=123456 
and b.TYPE = '02'  
)

尤其是and exists 条件是我无法解决的问题。我看到here,它可以由joinLEFT SEMI JOIN 完成,但由于我仍然不清楚如何使用它,我很高兴在上面的示例中看到它。感谢您的建议!

编辑:由于其他数据转换,我需要它与内置函数。比如:

def incrementalTransformFunction(output, fsInput, fsInput2):
    input_df = fsInput.dataframe('added')
    input2_df = fsInput2.dataframe('added')
    # output
    output.write_dataframe(input_df.drop(*drop_list).filter(input_df.incrnr==123456)
.andexists((b.id == o.id) & (o.ipdat == b.ipdat) & (b.incrnr == 123456) & (b.type == '02')))

【问题讨论】:

你能添加样本数据和预期输出吗 【参考方案1】:

您可以在 PySpqrk 中使用IN 条件,

Select * 
From FIRSTKEY o 
Where o.INCRNR=123456 And (o.ID,o.IPDAT) in  ( 
select ID, IPDAT from SECONDKEY b 
where b.INCRNR=123456 and b.TYPE = '02');

【讨论】:

是否可以通过内置功能实现?类似:output.write_dataframe(input_df.filter(input_df.incrnr==123456 & b.id == o.id)) 等...因为我必须做一些其他的转换并使用这种方法。【参考方案2】:

正如@Jim 建议的那样

SQL

Select * 
From FIRSTKEY o 
Where o.INCRNR=123456 And (o.ID,o.IPDAT) in  ( 
select ID, IPDAT from SECONDKEY b 
where b.INCRNR=123456 and b.TYPE = '02');

pyspark

FIRSTKEY.filter(col('INCRNR')=='123456').\
         join(SECONDKEY.filter((col('INCRNR')=='123456') & (col('TYPE')=='02')), ['ID', 'IPDAT'], 'inner') 

【讨论】:

以上是关于PySpark AND EXISTS 等价于 sql 查询的主要内容,如果未能解决你的问题,请参考以下文章

PySpark 中的 mkString 等价物是啥?

PySpark 中是不是有 .any() 等价物?

PySpark 中 pandas.cut() 的等价物是啥?

PySpark 中分类值的等价 groupyby().unique()

在 Pyspark HiveContext 中,SQL OFFSET 的等价物是啥?

Pyspark UDF 广播变量未定义仅在由单独脚本导入时