【发布时间】:2020-04-04 05:33:28
【问题描述】:
我觉得我必须在这里遗漏一些明显的东西,但我似乎无法在 Spark SQL 中动态设置变量值。
假设我有两个表,tableSrc 和 tableBuilder,我正在创建 tableDest。
我一直在尝试变体
SET myVar FLOAT = NULL
SELECT
myVar = avg(myCol)
FROM tableSrc;
CREATE TABLE tableDest(
refKey INT,
derivedValue FLOAT
);
INSERT INTO tableDest
SELECT
refKey,
neededValue * myVar AS `derivedValue`
FROM tableBuilder
在 T-SQL 中执行此操作是微不足道的,这对 Microsoft 来说是一个令人惊讶的胜利 (DECLARE...SELECT)。然而,Spark 会抛出
Error in SQL statement: ParseException:
mismatched input 'SELECT' expecting <EOF>(line 53, pos 0)
但我似乎无法将派生值分配给变量以供重用。我尝试了一些变体,但最接近的是将变量分配给 select 语句的字符串。
请注意,这是从 T-SQL 中的一个功能齐全的脚本改编而来的,所以我不会拆分十几个 SQL 变量来计算所有这些变量,使用 Python spark 查询来插入 @ 987654330@、{var2} 等在数百行 f 字符串中。 我知道如何做到这一点,但它会变得混乱、困难、难以阅读、迁移速度较慢、维护起来也更糟,因此我希望尽可能避免这种情况。
【问题讨论】:
-
如何计算没有分组依据的列的平均值?
-
只计算总平均值?这也是一个示例,只是为了测试它是否正常工作(真正的查询是在一个临时表上运行的,该表已经完成了我的所有过滤)。同样使用平均值以外的操作,我只是为问题选择了最简单的情况。
标签: apache-spark apache-spark-sql pyspark-sql databricks