gpt4 book ai didi

apache-spark - SELECT 语句中的 IN/EXISTS 谓词

转载 作者:行者123 更新时间:2023-12-02 20:12:00 25 4
gpt4 key购买 nike

我有以下 Spark SQL 测试查询:

Seq("france").toDF.createOrReplaceTempView("countries")
SELECT CASE WHEN country = 'italy' THEN 'Italy' 
ELSE ( CASE WHEN country IN (FROM countries) THEN upperCase(country) ELSE country END )
END AS country FROM users

抛出以下错误:

Exception in thread "main" org.apache.spark.sql.AnalysisException: 
IN/EXISTS predicate sub-queries can only be used in a Filter

查询的以下部分 CASE WHEN country IN (FROM countries) 就是原因。

Spark SQL 中是否存在任何解决方法,以便在选择条件下模拟 country IN (FROM countries)?我对纯 SQL 实现感兴趣,而不是通过 API 实现。

最佳答案

这是正确的 SQL 查询:

import sparkSession.implicits._

Seq("france").toDF("country").createOrReplaceTempView("countries")
Seq(("user1", "france"), ("user2", "italy"), ("user2", "usa"))
.toDF("user", "country").createOrReplaceTempView("users")

val query =
s"""
|SELECT
| CASE
| WHEN u.country = 'italy' THEN 'Italy'
| ELSE (
| CASE
| WHEN u.country = c.country THEN upper(u.country)
| ELSE u.country
| END
| ) END AS country
|FROM users u
|LEFT JOIN countries c
| ON u.country = c.country
""".stripMargin
sparkSession.sql(query).show()

结果:

+-------+
|country|
+-------+
| FRANCE|
| Italy|
| usa|
+-------+

您只能在谓词中使用 IN/EXISTS sql 运算符的幕后原因是:投影中的逻辑(在我们的例子中为 CASE-WHEN)已评估对于从选择返回的数据集中的每一行。考虑到这一点,为 users 表中的每一行运行等效的 CASE WHEN country IN (SELECT * FROM countries) 并不是最好的主意。因此,SQL 在语言级别(sql 解析器引擎)阻止了这种情况。

关于apache-spark - SELECT 语句中的 IN/EXISTS 谓词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53373091/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com