2017-09-13 191 views
0

我正在为我的公司工作。因此我需要使用Spark SQL case语句来过滤某些内容。Spark SQL中的case语句

我有一个名为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 

所以这段代码运行良好,但我不能在表中选择任何其他列。如果我在选择后写'*',我将得到以下错误信息:

处理异常:ParseException:当'expect','','','','','' GROUP',ORDER,HAVING,LIMIT,LATERAL,WINDOW,UNION,EXCEPT,INTERSECT,SORT,CLUSTER,DISTRIBUTE} ,pos 5)== SQL == Select * OPP_amount_eur < 30000 then 1 ----- ^^^ OPP_amount_eur> = 30000时的情况,当OPP_amount_eur> = 50000时为2,OPP_amount_eur> = 100000时为3,OPP_amount_eur> = 300000,那么当OPP_amount_eur> = 500000时为5,则当OPP_amount_eur> = 1000000时为6,则7结束为来自temptable3083b308bcec4124b6a4650f2bb40695的OPP_amount_eur_binned

为什么我不能这样做? 我在网上搜索它,并在正常的SQL似乎工作,为什么这是不可能在Spark SQL? 有没有解决方法?

我很抱歉我的不好的描述,但我绝对是新来的,我也从来没有与Spark SQL联系过。 我作为学生在我的培训生中。

+0

尽量'选择可输入解决方案*,CASE ...'。 (ANSI SQL方式。) – jarlh

+0

顺便说一句,这是'case' _expression_,而不是语句。 – jarlh

+0

非常感谢您的回复。我改变了你的建议,但我有另一个问题的代码。新列OPP_amount_eur_binned将被添加,但只填充'1'和'2'。例如,我在OPP_amount_eur列中的值为132917.94,而对应的开单列值为2 ...通常,它应该得到值'4',因为它大于100000,您是否知道为什么这是不工作? – mafin

回答

0

你应该使用别名:

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

这是我的问题

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