首页 > 解决方案 > Spark SQL(Databricks)-AnalysisException:无法评估内联表定义中的表达式outer()-多列聚合

问题描述

我正在从一些真正的关系数据库迁移到 (Azure) Databricks 6.2(包括 Apache Spark 2.4.4、Scala 2.11)。我只使用 Spark SQL。

因为 MIN 是一个聚合函数,并且获取多个值(列而不是行)的 MIN 很麻烦,所以我使用 VALUES 行构造函数来创建内联子查询,并在这个子查询上使用 MIN 聚合函数来生成简单的语句。

VALUE ROW 构造函数工作正常

select min(MinLatency) from (VALUES(1), (2), (3), (4), (5), (6), (7), (8)) MINL(MinLatency)

就像这个查询一样(附带问题,为什么我不能写 min(MINL.MinLatency) - 但这不是问题)

也可以作为子查询

select 
  Latency,
  (select sum(C1) from (VALUES(1), (2), (3), (4), (5), (6), (7), (8)) Y(C1)) as C 
from 
  (VALUES(1), (2), (3), (4), (5), (6), (7), (8)) as X(Latency)

但是做一个真正的查询(仅在本例中用常量简化)

select 
  T1.ID,
  --min of 4 Values
  T1.C1, T2.C2, T3.C3, T4.C4,
  --(select min(Value) from (VALUES(1),(2),(3),(4)) TI(Value)) as MIN
  (select min(Value) from (VALUES(T1.C1),(T2.C2),(T3.C3),(T4.C4)) TI(Value)) as MIN
from 
  (select 1 as ID, 1 as C1 union all select 2 as ID, 1 as C1) T1
  inner join (select 1 as ID, 2 as C2 union all select 2 as ID, 2 as C2) T2 on T1.ID=T2.ID
  inner join (select 1 as ID, 3 as C3 union all select 2 as ID, 3 as C3) T3 on T1.ID=T3.ID
  inner join (select 1 as ID, 4 as C4 union all select 2 as ID, 4 as C4) T4 on T1.ID=T4.ID 

Databricks / Spark 返回错误

SQL 语句中的错误:AnalysisException:无法计算内联表定义中的表达式 outer();第 6 行 34 号

如果您尝试使用常量,它会起作用。

问题是真的,

帮助表示赞赏

谢谢

标签: sqlapache-sparkdatabricks

解决方案


假设这些值是 never NULL,最简单的解决方案是LEAST()

select T1.ID,
       --min of 4 Values
       T1.C1, T2.C2, T3.C3, T4.C4,
       least(T1.C1, T2.C2, T3.C3, T4.C4)
. . . 

您也可以使用横向视图来执行此操作。一个简化的例子是:

select t1.id, min(c)
from t1 lateral view
     explode(array(c1, c2, c3, c4)) c
group by t1.id;

推荐阅读