如何将SQL查询转换为PySpark SQL并解决执行时EOL字符串字面量报错
问题修复方案
错误原因
你遇到的SyntaxError: EOL while scanning string literal报错不是PySpark SQL和标准SQL的语法差异导致的,属于Python基础语法错误:你用单引号包裹的SQL语句中间直接换行,Python解析到行尾都没有找到匹配的闭合单引号,因此抛出该异常。
除此之外你的SQL语句本身存在逻辑笔误,即使解决了字符串问题也无法正常执行。
修复步骤
1. 修复Python字符串换行问题
使用Python的三引号('''或""")包裹多行SQL语句,三引号原生支持字符串跨行,无需额外处理换行符,写法更清晰。
2. 修复SQL逻辑笔误
原SQL最后LEFT JOIN时误将带计数的cte3写成了cte4,而cte4只有Project Number字段没有cnt计数,会导致后续WHERE条件引用字段报错,需要修正关联表。
可直接运行的代码
# 用三引号包裹多行SQL,避免换行报错 check_sql = """ WITH cte1 AS ( select `Project Number` from vw_onco_pharma onco_pharma union all select `Project Number` from vw_onco_cell_gene cell_gene union all select `Project Number` from vw_non_onco_cell_gene onco_cell_gene union all select `Project Number` from vw_non_onco_pharma non_onco_pharma union all select `Project Number` from vw_plasma_protein plasma_protein ), cte2 AS ( SELECT `Project Number`, COUNT(*) cnt FROM cte1 GROUP BY `Project Number` ), cte3 AS ( select `Project Number`, COUNT(*) cnt from vw_FCT_HTA_ONC_NONONC_PGMS GROUP BY `Project Number` ), cte4 AS ( SELECT `Project Number` FROM cte1 UNION SELECT `Project Number` FROM cte3 ) SELECT `Project Number` FROM cte4 LEFT JOIN cte2 USING (`Project Number`) -- 修复原SQL笔误:第二个关联表是带cnt字段的cte3,不是cte4 LEFT JOIN cte3 USING (`Project Number`) WHERE cte2.cnt IS NULL OR cte3.cnt IS NULL OR cte2.cnt <> cte3.cnt; """ # 执行SQL result_df = spark.sql(check_sql) # 输出校验结果 result_df.show()
额外说明
你创建临时视图时输出的WARN日志不影响功能执行,只是Spark截断了过长的执行计划打印内容,如果需要查看完整执行计划,可以通过以下配置调整:
spark.conf.set("spark.sql.debug.maxToStringFields", 1000)
内容的提问来源于stack exchange,提问作者Shivika
相关产品推荐
相关产品推荐

