作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有以下 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/
我是一名优秀的程序员,十分优秀!