Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark SELECT语句中的Spark IN/EXISTS谓词_Apache Spark_Apache Spark Sql - Fatal编程技术网

Apache spark SELECT语句中的Spark IN/EXISTS谓词

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-

我有以下Spark SQL测试查询:

Seqfrance.toDF.createOrReplaceTempViewcountries 选择国家=‘意大利’和‘意大利’时的情况 ELSE案例当国家/地区从国家/地区输入时,则大写国家/地区ELSE国家/地区结束 从用户处作为国家/地区结束 这会引发以下错误:

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|
+-------+