【问题标题】:case statement in Spark SQLSpark SQL 中的 case 语句
【发布时间】:2025-12-05 17:30:01
【问题描述】:

我正在为我的公司制定工作流程。因此,我需要使用 Spark SQL 案例语句来过滤某些内容。

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

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

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:不匹配的输入 'when' 期望 {、','、'FROM'、'WHERE'、'GROUP'、'ORDER'、'HAVING'、'LIMIT'、'LATERAL'、' WINDOW', 'UNION', 'EXCEPT', 'INTERSECT', 'SORT', 'CLUSTER', 'DISTRIBUTE'}(第 2 行,第 5 行)== SQL == 选择 * 当 OPP_amount_eur = 30000 然后 2 当 OPP_amount_eur >= 50000 然后 3 当 OPP_amount_eur >= 100000 然后 4 当 OPP_amount_eur >= 300000 然后 5 当 OPP_amount_eur >= 500000 然后 6 当 OPP_amount_eur >= 1000000 然后 7 结束OPP_amount_eur_binned 来自 temptable3083b308bcec4124b6a4650f2bb40695

为什么我不能这样做? 我在互联网上搜索它并且在普通 SQL 中它似乎可以工作,为什么这在 Spark SQL 中是不可能的? 有什么解决办法吗?

我很抱歉我的描述不好,但我在这里绝对是新人,而且我从未接触过 Spark SQL。 我正在实习。

【问题讨论】:

  • 试试SELECT inputTable.*, CASE ...。 (ANSI SQL 方式。)
  • 顺便说一句,这是case 表达式,而不是声明。
  • 非常感谢您的回复。我按照您的建议更改了代码,但我还有另一个问题。将添加新列 OPP_amount_eur_binned,但仅填充“1”和“2”。例如,我的 OPP_amount_eur 列中的值为 132917.94,对应的计费列的值为 2...通常它应该得到值“4”,因为它大于 100000,你知道这是为什么不工作?
  • 好的,我发现了问题,我必须使用 between 运算符,现在它可以工作了:)

标签: sql apache-spark-sql case case-statement


【解决方案1】:

你应该使用别名:

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

【讨论】:

    【解决方案2】:

    这是我的问题的解决方案

     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
    

    【讨论】: