Spark SQL使用GROUPING SETS遇语法错误:mismatched input 'x_flag'
Spark SQL GROUPING SETS语法错误修复
我用Spark SQL的GROUPING SETS生成汇总列,替代之前的Cube来缩减输出文件大小。x_flag列是0、1的整数类型,核心基于它做分组,但执行代码时遇到语法错误。
原代码
final_sum = sqlContext.sql(''' SELECT case when GROUPING(x_flag)=1 then 'total' else x_flag END AS x_flag, ... from trans, group by x_flag,..., GROUPING SETS( (x_flag,y_name) ... ) ''')
错误信息
mismatched input x_flag expecting {, ';'}(line 14, pos 11)
修复方案
不需要将x_flag改为y/n,只需修正两个关键问题:
移除语法冗余的逗号
- FROM子句后的
trans,末尾逗号要删掉(无关联其他表时,逗号属于语法错误) - GROUP BY子句后的
x_flag,...,末尾逗号要删掉,避免解析器误判结构
- FROM子句后的
统一CASE WHEN的返回类型
THEN返回字符串'total',ELSE返回整数x_flag,类型不匹配会导致执行错误,需把x_flag转为字符串:CASE WHEN GROUPING(x_flag) = 1 THEN 'total' ELSE CAST(x_flag AS STRING) END AS x_flag
修正后的代码示例
final_sum = sqlContext.sql(''' SELECT CASE WHEN GROUPING(x_flag) = 1 THEN 'total' ELSE CAST(x_flag AS STRING) END AS x_flag, -- 补充你的聚合列或其他字段,比如SUM(amount) AS total_amount FROM trans GROUP BY GROUPING SETS( (x_flag, y_name) -- 补充其他分组集合,比如(x_flag), ()等 ) ''')
如果你的Spark版本要求GROUP BY后先列出所有分组涉及的列,可调整为:
final_sum = sqlContext.sql(''' SELECT CASE WHEN GROUPING(x_flag) = 1 THEN 'total' ELSE CAST(x_flag AS STRING) END AS x_flag, SUM(amount) AS total_amount FROM trans GROUP BY x_flag, y_name GROUPING SETS( (x_flag, y_name), (x_flag), () ) ''')
内容的提问来源于stack exchange,提问作者luangamornlertp
相关产品推荐
相关产品推荐

