Spark SQL中子查询无匹配列仍可运行的原因探究
为什么Spark SQL中带IN子查询的语句未报错反而正常运行?
这是因为Spark SQL的列解析规则允许子查询引用外部查询的同名字段,具体逻辑如下:
- 列解析的作用域优先级:当子查询中的列无法在自身关联的表(这里是
graduateProgram)中找到时,Spark会自动向上查找外部查询的表(这里是person)中是否存在该列,这属于相关子查询的解析逻辑。 - 你的查询实际等价逻辑:子查询
SELECT graduate_program FROM graduateProgram会被解析为SELECT person.graduate_program FROM graduateProgram,也就是对graduateProgram的每一行,都返回当前外部person行的graduate_program值。 - WHERE条件的实际效果:最终WHERE条件变为
person.graduate_program IN (person.graduate_program),这个条件永远为真,因此查询会返回person表的所有数据。
而单独运行子查询时,没有外部查询的上下文,Spark无法找到graduate_program列,自然会触发列不存在的报错。
内容的提问来源于stack exchange,提问作者DumbCoder
相关产品推荐
相关产品推荐

