一、前言
用过大数据的同事都熟悉hive和Spark,两者的语法是一样的,但是Spark的速度要比Hive快得多。今天才写一个Spark的大数据报表的时候,遇到一个group by结合Case When的语法问题,现将问题的详细经过记录下来,希望可以对有遇到这个问题伙伴一些帮助。
二、问题
运行报错详细如下截图:
很明显是case when的语句中错误导致,反复检查了几遍,如去掉多余的空格,增加空格,去掉括号,增加括号等。原SQL如下:
drop table temp_fin.cux_trx_vpk_order;
create table temp_fin.cux_trx_vpk_order as
select
l.org_id,l.period_name,(CASE WHEN l.line_type = 'SKU' THEN l.item_type ELSE l.description END),l.tax_code ,l.currency_code,
sum(l.line_amount ) line_amount,sum(l.acctd_line_amount ) acctd_line_amount,sum(l.net_amount ) net_amount,sum(l.tax_amount ) tax_amount
from temp_fin.cux_trx_line2 l
where l.is_deleted =0
group by l.org_id,l.period_name,(CASE WHEN l.line_type = 'SKU' THEN l.item_type ELSE l.description END),l.tax_code ,l.currency_code;
不细心的话很难发现问题,其根本原因是select 的时候,虽然case when 的语法是对的,case when 的用法逻辑是:如果符合某个条件,则用前者,否则用后者。但是最终需要一个查询结果的别称来承接这个字段结果值。
三、解决
正如报错截图中的提示,please use alias to rename it,意思是请使用字段别称来重新命名,这个是出现在Case When后面的使用语法,所以很简单,用as + 别称 即可解决问题:
原写法:CASE WHEN l.line_type = 'SKU' THEN l.item_type ELSE l.description END
改正:CASE WHEN l.line_type = 'SKU' THEN l.item_type ELSE l.description END as line_type