Spark SQL执行报错EOL while scanning string literal 语法问题求助
错误原因定位
该EOL while scanning string literal语法错误属于Python语法规则触发的报错,和你写的Spark SQL本身逻辑无关:
Python中普通双引号"包裹的字符串不支持直接跨行书写,你将多行SQL语句用单个双引号包裹,Python解析到第一行字符串结尾的换行符时,还未扫描到匹配的闭合双引号,就会抛出该类行尾扫描错误。
解决方法
推荐优先使用第一种方案,改动最小且易维护:
- 方案1:将包裹SQL的单个双引号替换为三重双引号
""",无需调整原有SQL的换行格式即可正常识别多行字符串:
results = spark.sql( """ select b.* from ( select a.*, dense_rank() over (partition by nm order by total desc) as rnk from ( select dt, code, nm, sum(num) as total from cases group by dt, code, nm )a )b where b.rnk = 1 order by total desc, dt """ )
- 方案2:保留单个双引号的前提下,在每一行SQL字符串的末尾添加反斜杠
\转义换行符,该方案容易漏加转义符,不推荐使用:
results = spark.sql( " \ select b.* \ from ( \ select a.*, dense_rank() over (partition by nm order by total \ desc) as rnk \ from ( \ select dt, code, nm, sum(num) as total \ from cases \ group by dt, code, nm \ )a \ )b \ where b.rnk = 1 \ order by total desc, dt \ " )
修改完成后可先打印字符串验证SQL内容是否完整,确认无误后再执行查询即可。
内容的提问来源于stack exchange,提问作者NM24
相关产品推荐
相关产品推荐

