PySpark无法识别SQL子查询外部临时视图表的问题求助
PySpark子查询无法引用外部视图的解决方案
问题原因
你写的SQL中,FROM子句里的派生表(嵌套子查询)属于非关联子查询,Spark会优先独立执行这个子查询,此时子查询内部只能访问自身引用的mkt表,无法感知外部的loan表,因此会抛出无法解析loan.id的错误。
解决方案
方案1:将关联条件移至JOIN的ON子句(推荐)
直接把原分子查询里的loan.id >= mkt.id条件合并到JOIN的关联条件中,无需嵌套子查询,Spark可以正确识别两个表的字段:
ldf.createOrReplaceTempView("loan") mdf.createOrReplaceTempView("mkt") df = spark.sql("SELECT * FROM loan JOIN mkt ON loan.qtr = mkt.qtr AND loan.id >= mkt.id LIMIT 1") df.show()
方案2:改用支持的关联子查询语法(按需选择)
如果业务逻辑需要使用子查询,可以用Spark支持的EXISTS关联子查询写法(逻辑与原SQL略有差异,仅返回存在匹配mkt记录的loan数据):
ldf.createOrReplaceTempView("loan") mdf.createOrReplaceTempView("mkt") df = spark.sql("SELECT * FROM loan WHERE EXISTS (SELECT 1 FROM mkt WHERE mkt.qtr = loan.qtr AND loan.id >= mkt.id) LIMIT 1") df.show()
总结
Spark对FROM子句中派生表的外部字段引用支持有限,这类子查询会被当作独立查询执行,无法访问外部表的字段。优先推荐方案1的写法,逻辑清晰且符合Spark的SQL执行规则。
内容的提问来源于stack exchange,提问作者user19627118
相关产品推荐
相关产品推荐

