PySpark执行多行SQL时出现EOF in multi-line string错误求助
修复PySpark执行SQL时的
EOF in multi-line string错误 问题诊断
出现该错误的核心原因是SQL字符串中混入了全角空格(非标准半角空格),具体位置在子查询结尾的) b处。这种特殊字符会干扰Python的字符串tokenization流程,导致解析器误判多线字符串未正确闭合。此外,Hive兼容的隐式逗号JOIN语法,在PySpark的SQL解析器中可能引发额外的解析歧义。
修复步骤
- 替换所有全角空格为普通半角空格,重点检查子查询括号与表别名之间的空格。
- 将隐式逗号JOIN改为显式
INNER JOIN ... ON语法,明确表关联逻辑,避免解析歧义。 - 确保f-string的三个双引号
"""前后无多余转义字符或格式混乱。
修复后的代码示例
spark.sql(f""" create table DEFAULT.TMP_TABLE as select b.customer_id, prob from bi_prod.TMP_score_1st_day a inner join ( select customer_id, prob from BI_prod.Tbl_brand1_scoring where insert_date = 20230101 union all select customer_id, prob from BI_prod.Tbl_brand2_scoring where insert_date = 20230101 ) b on a.customer_id = b.customer_id """)
额外验证建议
- 执行前可通过
print()输出SQL字符串,检查是否存在隐藏的特殊字符或格式错误。 - 确认
insert_date字段类型:如果该字段是字符串类型,需将20230101改为'20230101',避免PySpark出现类型不匹配错误(Hive可能自动兼容此类隐式转换,但PySpark解析更严格)。
内容的提问来源于stack exchange,提问作者habibalsaki
相关产品推荐
相关产品推荐

