sql - 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 号
如果您尝试使用常量,它会起作用。
问题是真的,
- 我做错了什么?
- 真的不支持吗?为什么?
- 如何在 Spark SQL 中像这样简单地执行多列 MIN?(就像 min 忽略 NULL 值)
帮助表示赞赏
谢谢
解决方案
假设这些值是 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;
推荐阅读
- sql - 计算记录分组的所有现有组合
- javascript - 如何解决与 redux store 相关的“Invariant Violation”错误?
- http - erlang:如何从套接字接收 HTTP/RTSP 消息?
- google-play - Beta 版应用程序显示在浏览器中,但未显示在 Google Play 中?
- excel - 如何遍历 a 列中的单元格以从每个单元格中的数据库返回值
- jquery - 删除具有特定 attr 值的选择元素
- r - 如何在错误分析中去除 NA 值
- python - 为什么在 Python 中重写类的 __get__ 方法会影响返回的内容?
- css - Angular:group() 函数不会并行运行动画,会破坏动画流程
- javascript - jQuery如何在选择器上加载图像后执行功能?