Spark SQL使用变量替代字段名报错及完整查询适配问题求助
问题分析与解决
第一个错误:无法解析prykey字段
原因
你直接写select prykey from allprior时,Spark SQL会把prykey当作字段名去表中查找,但你的表allprior里根本没有名为prykey的字段,所以抛出解析错误。普通字符串不会自动解析Python变量,导致变量没有被替换成实际的字段名(比如FlagFileType)。
解决方法
使用Python的f-string将变量值插入到SQL语句中,让SQL语句生成时自动替换为实际字段名:
df = sql(f"select {prykey} from allprior")
这样生成的SQL会是select FlagFileType from allprior(假设prykey的值是FlagFileType),和你之前能正常运行的查询一致。
第二个错误:SQL语法错误
原因
你在f-string的SQL语句中存在多余的英文句点(.):
where.{prykey}缺少表别名且多了句点,应该关联子查询的别名uselect.{prykey} from allprior多了句点,直接引用字段即可order by .{prykey}多了句点,直接指定排序字段即可
这些多余的句点破坏了SQL的语法结构,导致Spark无法正确解析语句。
解决方法
修正所有语法错误的位置,调整后的完整代码如下:
df = sql(f""" select allprior.*, 'D' as Indicator from allprior left outer join maxversion on allprior.{prykey} = maxversion.{prykey} where maxversion.{prykey} is null union all select maxversion.*, 'A' as Indicator from allprior right outer join maxversion on allprior.{prykey} = maxversion.{prykey} where allprior.{prykey} is null union all select *, 'U' from ( select * from maxversion except select * from allprior ) u where u.{prykey} in (select {prykey} from allprior) union all select *, 'E' from ( select * from allprior intersect select * from maxversion ) e order by {prykey}""")
内容的提问来源于stack exchange,提问作者Patterson
相关产品推荐
相关产品推荐

