SPARK SQL - 当时的情况

use*_*189 26 sql apache-spark

我是SPARK-SQL的新手.在SPARK SQL中是否有相当于"CASE WHEN'条件'那么0结束1"的结果?

select case when 1=1 then 1 else 0 end from table

谢谢Sridhar

Spi*_*lov 45

在Spark 1.2.0之前

支持的语法(我刚刚在Spark 1.0.2上试过)似乎是

SELECT IF(1=1, 1, 0) FROM table
Run Code Online (Sandbox Code Playgroud)

这个最近的线程http://apache-spark-user-list.1001560.n3.nabble.com/Supported-SQL-syntax-in-Spark-SQL-td9538.html链接到SQL解析器源,可能会也可能不会根据您对Scala的舒适度提供帮助.至少在第70行开始(在撰写本文时)的关键字列表应该有所帮助.

为方便起见,这里是源代码的直接链接:https://github.com/apache/spark/blob/master/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/SqlParser.scala.

Spark 1.2.0及更高版本的更新

从Spark 1.2.0开始,支持更传统的语法,以响应SPARK-3813:在测试源中搜索"CASE WHEN" .例如:

SELECT CASE WHEN key = 1 THEN 1 ELSE 2 END FROM testData
Run Code Online (Sandbox Code Playgroud)

更新最近的地方以找出SQL Parser的语法

现在可以在此处找到解析器源.

更新更复杂的示例

在回答下面的问题时,现代语法支持复杂的布尔条件.

SELECT
    CASE WHEN id = 1 OR id = 2 THEN "OneOrTwo" ELSE "NotOneOrTwo" END AS IdRedux
FROM customer
Run Code Online (Sandbox Code Playgroud)

您可以在条件中涉及多个列.

SELECT
    CASE WHEN id = 1 OR state = 'MA' 
         THEN "OneOrMA" 
         ELSE "NotOneOrMA" END AS IdRedux
FROM customer
Run Code Online (Sandbox Code Playgroud)

你也可以在表达时嵌套CASE.

SELECT
    CASE WHEN id = 1 
         THEN "OneOrMA"
         ELSE
             CASE WHEN state = 'MA' THEN "OneOrMA" ELSE "NotOneOrMA" END
    END AS IdRedux
FROM customer
Run Code Online (Sandbox Code Playgroud)


Ehu*_*Lev 20

对于Spark 2. + Spark功能

来自文档:

计算条件列表并返回多个可能的结果表达式之一.如果最后没有定义,则为不匹配的条件返回null.

 // Example: encoding gender string column into integer.

   // Scala:
   people.select(when(people("gender") === "male", 0)
     .when(people("gender") === "female", 1)
     .otherwise(2))

   // Java:
   people.select(when(col("gender").equalTo("male"), 0)
     .when(col("gender").equalTo("female"), 1)
     .otherwise(2))
Run Code Online (Sandbox Code Playgroud)

  • 谢谢Ehud!我用这种方法用几行代码构建一个复杂的嵌套查询! (2认同)