Apache spark SELECT语句中的Spark IN/EXISTS谓词
我有以下Spark SQL测试查询: Seqfrance.toDF.createOrReplaceTempViewcountries 选择国家=‘意大利’和‘意大利’时的情况 ELSE案例当国家/地区从国家/地区输入时,则大写国家/地区ELSE国家/地区结束 从用户处作为国家/地区结束 这会引发以下错误:Apache spark SELECT语句中的Spark IN/EXISTS谓词,apache-spark,apache-spark-sql,Apache Spark,Apache Spark Sql,我有以下Spark SQL测试查询: Seqfrance.toDF.createOrReplaceTempViewcountries 选择国家=‘意大利’和‘意大利’时的情况 ELSE案例当国家/地区从国家/地区输入时,则大写国家/地区ELSE国家/地区结束 从用户处作为国家/地区结束 这会引发以下错误: Exception in thread "main" org.apache.spark.sql.AnalysisException: IN/EXISTS predicate sub-
Exception in thread "main" org.apache.spark.sql.AnalysisException:
IN/EXISTS predicate sub-queries can only be used in a Filter
下面是查询案例的一部分,原因是country IN FROM countries
Spark SQL中是否存在任何变通方法,以便在选择的条件下模仿国家/地区?我感兴趣的是纯SQL实现,而不是通过API实现。作为您可以使用的替代方案 带柱 及 什么时候 功能来自: 结果:
+------+-------+
|userId|country|
+------+-------+
| 1| FRANCE|
| 2| Italy|
| 3| Italy|
+------+-------+
以下是正确的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运算符的原因是:投影中的逻辑—在我们的例子中,为从选择返回的数据集中的每一行求值。
考虑到这一点,最好不要对users表中的每一行运行与SELECT*FROM COUNTRYES中的country相同的CASE。因此,SQL在语言级别的SQL解析器引擎上防止了这种情况。谢谢您的回答。现在我主要对纯SQL实现感兴趣。
+-------+
|country|
+-------+
| FRANCE|
| Italy|
| usa|
+-------+