2017-09-13 153 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