Spark 中的 case 语句 SQL

case statement in Spark SQL

我正在为我的公司制定工作流程。因此我需要使用 Spark SQL case-statement 来过滤一些东西。

我有一个名为 OPP_amount_euro 的列(用于某事的金额保存在那里)和一个名为 OPP_amount_euro_binned 的列(默认值为 1)。 所以我想编程某种间隔。 如果 OPP_amount_euro 中的值 < 30000,则 OPP_amount_euro_binned 中的值应为 1,依此类推。

我已经尝试找到解决方案,但它不是最好的。

select
case when OPP_amount_eur < 30000 then 1
when OPP_amount_eur >= 30000 then 2
when OPP_amount_eur >= 50000 then 3
when OPP_amount_eur >= 100000 then 4
when OPP_amount_eur >= 300000 then 5
when OPP_amount_eur >= 500000 then 6
when OPP_amount_eur >= 1000000 then 7
end as OPP_amount_eur_binned
from inputTable

所以这段代码运行良好,但我不能 select table 中的任何其他列。如果我在 select 之后写一个 '*',我将收到以下错误消息:

Exception in processing: ParseException: mismatched input 'when' expecting {, ',', 'FROM', 'WHERE', 'GROUP', 'ORDER', 'HAVING', 'LIMIT', 'LATERAL', 'WINDOW', 'UNION', 'EXCEPT', 'INTERSECT', 'SORT', 'CLUSTER', 'DISTRIBUTE'}(line 2, pos 5) == SQL == Select * case when OPP_amount_eur < 30000 then 1 -----^^^ when OPP_amount_eur >= 30000 then 2 when OPP_amount_eur >= 50000 then 3 when OPP_amount_eur >= 100000 then 4 when OPP_amount_eur >= 300000 then 5 when OPP_amount_eur >= 500000 then 6 when OPP_amount_eur >= 1000000 then 7 end as OPP_amount_eur_binned from temptable3083b308bcec4124b6a4650f2bb40695

为什么我不能这样做? 我在互联网上搜索了它,在正常情况下 SQL 它似乎可以工作,为什么这在 Spark SQL 中是不可能的? 有什么解决办法吗?

对于我的错误描述,我深表歉意,但我在这里绝对是新手,而且我从未接触过 Spark SQL。 我是一名学生。

您应该使用别名:

SELECT CASE....,
       t.*
FROM YourTable t

这是我的问题的解决方案

 Select inputTable.*,

case 
     when OPP_amount_eur between 0 and 30000 then 1
     when OPP_amount_eur between 30000 and 50000 then 2
     when OPP_amount_eur between 50000 and 100000 then 3
     when OPP_amount_eur between 100000 and 300000 then 4
     when OPP_amount_eur between 300000 and 500000 then 5
     when OPP_amount_eur between 500000 and 1000000 then 6
     else '7'

     end as OPP_amount_eur_binned

from inputTable