PySpark执行group by col,cube(col1,col2)语句报AnalysisException问题
PySpark GROUP BY混合普通列与CUBE语法报错问题解决
问题原因
PySpark 3.1.x及更早版本不支持在GROUP BY子句中混合普通列和CUBE/ROLLUP多维聚合函数,该语法是从Spark 3.2版本才开始兼容的SQL标准特性,因此你在3.1.2版本运行会触发AnalysisException报错。而Oracle 19c很早就实现了该语法支持,所以可以正常执行。
解决方案
方案1:调整CUBE范围+过滤分组(无需升级Spark)
把roll也放进CUBE的参数中,再通过grouping(roll)=0过滤掉roll被聚合的分组,逻辑和你原SQL完全等价:
spark.sql(''' select grouping(roll), grouping(grade), grouping(subject), count(*) from dfview group by cube(roll, grade, subject) having grouping(roll) = 0 ''').show()
方案2:用GROUPING SETS手动枚举分组(无需升级Spark)
你原需求的本质是固定roll维度,仅对grade和subject做全组合聚合,对应4种分组维度,直接用GROUPING SETS显式声明即可:
spark.sql(''' select grouping(roll), grouping(grade), grouping(subject), count(*) from dfview group by grouping sets ( (roll, grade, subject), (roll, grade), (roll, subject), (roll) ) ''').show()
方案3:升级Spark版本
直接将PySpark升级到3.2.0及以上版本,你原有的SQL无需任何修改即可正常运行。
内容的提问来源于stack exchange,提问作者Anirban Chakraborty
相关产品推荐
相关产品推荐

