执行Spark插入查询时遇ParseException错误:input 'with'无可行替代方案求助
解决Spark SQL INSERT语句中的ParseException错误
Hey Lara,我来帮你搞定这个Spark SQL的语法错误!
你遇到的org.apache.spark.sql.catalyst.parser.ParseException: No viable alternative at input 'with' to insert in a table错误,本质是Spark SQL不支持把WITH子句(公共表表达式CTE)放在INSERT INTO语句的后面,它的语法规则要求CTE必须位于整个INSERT语句的最开头。
错误的原语句
INSERT INTO users partition(date) WITH existentes AS (SELECT COUNT(1) AS name FROM users WHERE date=20160303)
修正后的正确写法
根据你的需求(先定义CTE再插入数据),需要把WITH子句移到最前面,同时还要确保插入的字段和表结构匹配(比如分区字段date需要在插入的结果集中):
WITH existentes AS ( -- 这里把AS name改成AS count_name更贴合语义,避免和表字段混淆 SELECT COUNT(1) AS count_name FROM users WHERE date=20160303 ) INSERT INTO users PARTITION(date) -- 插入时需要指定分区值,同时匹配表的其他字段 SELECT count_name, 20160303 FROM existentes;
额外说明
错误提示里的no viable alternative at input 'with'其实就是Spark SQL的语法解析器无法识别INSERT INTO后面紧跟WITH的结构,只要调整CTE的位置到语句最开头,就能解决这个问题啦。
内容的提问来源于stack exchange,提问作者Lara




