You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 23:45:05