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

ので、このコードがうまく機能しているが、私は、テーブル内の任意の更なる列を選択can't。私が選択した後に「*」を記述する場合、私はエラーメッセージを以下取得します:処理中

例外:はParseException:不一致入力「とき」期待{、」、 『『FROM』、『WHERE』、』 (2行目)(2行目、2行目、2行目、2行目、2行目、2行目、2行目、3行目) OPP_amount_eur> = 30000の場合は1 ----- ^^^ OPP_amount_eur> = 50000の場合は2、OPP_amount_eur> = 100000の場合は3、OPP_amount_eur> OPP_amount_eur_binnedよう= 300000次いで5ときOPP_amount_eur> = 500000次いで6場合OPP_amount_eur> = 1000000次に7端temptable3083b308bcec4124b6a4650f2bb40695

から

なぜ私はこれをすることができないのですか? 私はそれをインターネット上で検索しました。通常のSQLでは動作しているように見えますが、なぜこれはSpark SQLでは不可能ですか? 解決策はありますか?

私の悪い記述には申し訳ありませんが、私はここで絶対に新しいですし、私はスパークSQLと接触したこともありませんでした。 私は学生として私の訓練に就いています。

+0

のためのソリューションです...'。 (ANSI SQLの方法です) – jarlh

+0

ところで、それは 'case' _expression_、not文です。 – jarlh

+0

ご返信ありがとうございます。あなたのようにコードを変更しましたが、別の問題があります。新しい列OPP_amount_eur_binnedは追加されますが、「1」と「2」でのみ埋められます。たとえば、私はOPP_amount_eurの列に132917.94の値を持っていて、correspondigの請求された列は2の値を持っています...それは100,000よりも大きいので、通常は値 '4'を取得する必要があります。働いていない? – mafin

答えて

0

あなたは別名を使用する必要があります。

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

これは入力可能にSELECT `試してみてください*、CASE私の問題

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