EMR 6.10.1上PySpark执行SELECT语句无法识别计算列求助
问题原因与解决方案
这个问题是由EMR 6.10.1默认启用的ANSI SQL解析模式导致的:
- 在ANSI SQL规范中,SELECT子句里的列别名不能被同一层级的其他表达式引用(比如你用
a计算b,再用b计算d属于同一层级的向前引用),Spark开启ANSI模式后会严格遵循这个规范,因此抛出Column 'a' does not exist的异常。 - 本地机器、Databricks等环境默认未开启ANSI模式,允许这种非标准的向前引用写法,所以可以正常执行。
解决方式
1. 修改Spark配置
在EMR集群的Spark配置中,将spark.sql.parser.ansi.enabled设置为false,关闭ANSI模式:
- 提交Spark作业时通过参数指定:
--conf spark.sql.parser.ansi.enabled=false - 也可以在EMR集群的
spark-defaults.conf配置文件中永久修改该参数。
2. 调整SQL写法(推荐,符合ANSI规范)
如果不想修改全局配置,可将SQL改为符合ANSI规范的写法,通过子查询或CTE传递列别名:
-- 使用子查询 spark.sql("select a, a+a as b, (a+a)+(a+a) as d from (select 1 as a) t").show() -- 使用CTE spark.sql("with t as (select 1 as a) select a, a+a as b, b+b as d from t").show()
内容的提问来源于stack exchange,提问作者Dimi
相关产品推荐
相关产品推荐

