如何解决Spark SQL报mismatched input 'line' expecting <EOF>错误
错误原因
报错的核心是嵌套CASE WHEN语法结构不完整:原SQL共声明了3层CASE,仅配套了2个END闭合标记,同时最外层CASE的ELSE分支位置放置错误,导致Spark SQL解析器无法识别完整的查询结构,提前判定语句应该结束(即<EOF>标记),因此抛出字段匹配错误。
修正后可运行的SQL
你原本的业务逻辑是:仅当line值为KEY时才处理pop字段,符合规则则提取@前的数字段,其余场景返回空值,修正后的完整语法如下:
select case when line = 'KEY' then case when length(pop)>0 and pop not rlike '^[0-9]+@.*' then '' when pop rlike '^[0-9]+@.*' then regexp_extract(pop, '^[^@]+', 0) else '' end else '' end as pop from input
简化优化建议
你可以合并判断条件减少嵌套层级,提升代码可读性,最终实现效果和原逻辑完全一致:
select case when line = 'KEY' and pop rlike '^[0-9]+@.*' then regexp_extract(pop, '^[^@]+', 0) else '' end as pop from input
内容的提问来源于stack exchange,提问作者Only developer
相关产品推荐
相关产品推荐

