【问题标题】:PySpark AND EXISTS equivalent to sql queryPySpark AND EXISTS 等价于 sql 查询
【发布时间】: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')))

【问题讨论】:

  • 你能添加样本数据和预期输出吗

标签: sql pyspark


【解决方案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') 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多