[英]SPARK SQL - case when then
我是 SPARK-SQL 的新手。 SPARK SQL 中是否有等效于“CASE WHEN 'CONDITION' THEN 0 ELSE 1 END”?
select case when 1=1 then 1 else 0 end from table
谢谢斯里达尔
Spark 1.2.0 之前
支持的语法(我刚刚在 Spark 1.0.2 上尝试过)似乎是
SELECT IF(1=1, 1, 0) FROM table
这个最近的线程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
更新最近的地方以从 SQL 解析器中找出语法
现在可以在此处找到解析器源代码。
更新更复杂的例子
针对以下问题,现代语法支持复杂的布尔条件。
SELECT
CASE WHEN id = 1 OR id = 2 THEN "OneOrTwo" ELSE "NotOneOrTwo" END AS IdRedux
FROM customer
您可以在条件中涉及多个列。
SELECT
CASE WHEN id = 1 OR state = 'MA'
THEN "OneOrMA"
ELSE "NotOneOrMA" END AS IdRedux
FROM customer
您还可以嵌套 CASE WHEN THEN 表达式。
SELECT
CASE WHEN id = 1
THEN "OneOrMA"
ELSE
CASE WHEN state = 'MA' THEN "OneOrMA" ELSE "NotOneOrMA" END
END AS IdRedux
FROM customer
对于 Spark 2.+ Spark when 函数
从文档:
评估条件列表并返回多个可能的结果表达式之一。 如果最后未定义其他内容,则为不匹配的条件返回 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))
这种语法在 Databricks 中对我有用:
select
org,
patient_id,
case
when (age is null) then 'Not Available'
when (age < 15) then 'Less than 15'
when (age >= 15 and age < 25) then '15 to 25'
when (age >= 25 and age < 35) then '25 to 35'
when (age >= 35 and age < 45) then '35 to 45'
when (age >= 45) then '45 and Older'
end as age_range
from demo
Based on my current production code, this works
val identifierDF =
tempIdentifierDF.select(tempIdentifierDF("t_item_account_id"),
when(tempIdentifierDF("h_description").contains(tempIdentifierDF("t_cusip")),100)
.when(tempIdentifierDF("h_description").contains(tempIdentifierDF("t_ticker")),100)
.when(tempIdentifierDF("h_description").contains(tempIdentifierDF("t_isin")),100)
.when(tempIdentifierDF("h_description").contains(tempIdentifierDF("t_sedol")),100)
.when(tempIdentifierDF("h_description").contains(tempIdentifierDF("t_valoren")),100)
.otherwise(0)
.alias("identifier_in_description_score")
)
Spark DataFrame API(Python 版本)还可以执行下一个查询:
df.selectExpr('time', \
'CASE WHEN (time > 1) THAN time * 1.1 ELSE time END AS updated_time')
Oracle SQL for SQL Spark 的 decode() 函数模拟可以实现如下:
case
when exp1 in ('a','b','c')
then element_at(map('a','A','b','B','c','C'), exp1)
else exp1
end
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.