spark sql correlated scalar subqueries must be aggregated 错误解决

最近在客户中使用spark sql 做一些表报处理,但是在做数据关联时,老是遇到 “correlated scalar subqueries must be aggregated” 错误

举一个例子,这个sql 在oracle 或者 postgresql 都是可以正常运行的,但是在spark sql 就会报错“correlated scalar subqueries must be aggregated”

SELECT   A.dep_id,
         A.employee_id,
         A.age,
         (SELECT  age FROM employee B WHERE A.dep_id = B.dep_id) max_age
FROM     employee A
ORDER BY 1,2

在参考博客参考博客中就有一个解决方案

SELECT   A.dep_id,
         A.employee_id,
         A.age,
         (SELECT  MAX(age) FROM employee B WHERE A.dep_id < B.dep_id) max_age
FROM     employee A
ORDER BY 1,2
  • 问题分析

实际上,发生问题的地方是 子查询 “SELECT  age FROM employee B WHERE A.dep_id = B.dep_id”。

为什么会发生这个错误呢?

因为在spark sql 中,执行select 的关键字地方,如果sql 中依然包括子查询,这个时候有一个问题,就是如果子查询返回多个结果集会有不可预期的结果,所以就会报错:

“correlated scalar subqueries must be aggregated”。

然后解决的思路就是简单了,如果spark sql 担心select 关键字中当有子查询并且会返回多个记录,那么我们只要保证 子查询 只会返回一个结果,就能够完美解决这个问题,所以我们改造的思路就是在子查询中,增加 Max() 函数,这样就可以确保子查询返回结果只有一个。

 

原文地址:https://www.cnblogs.com/chenfool/p/11179438.html