No matching method for class org.apache.hadoop.hive.ql.udf.generic.GenericUDFOPDivide with (bigint,b

项目场景:

在进行hive建表的时候出现的问题
FAILED: SemanticException [Error 10014]: Line 23:68 Wrong arguments ‘sau_kpimrcnt’: No matching method for class org.apache.hadoop.hive.ql.udf.generic.GenericUDFOPDivide with (bigint, boolean)

问题描述:

FAILED: SemanticException [Error 10014]: Line 23:68 Wrong arguments 'sau_kpimrcnt': No matching method for class org.apache.hadoop.hive.ql.udf.generic.GenericUDFOPDivide with (bigint, boolean)

原因分析:

在我使用的insert+select语句中,我想直接在外层出一个字段,于是我就萌生了这样的想法

,case when round((sum(xxx)/sum(xxx),4)>80 then 0
when round((sum(xxx)/sum(xxx),4)>60 then 1
else 2 end as da

这个地方我一开始并不觉得有问题,于是我就这样执行,但是发现一直报上面的那个错误,后面我就去查了查,发现好像没有这种写法,就只有这种写法

sum(case when ...then ..
	when ...)

解决方案:

这里如何解决就是,你只需要在里层把他封装一下下
就是像这样
xxx字段,yyy表

insert overwrite table yyy partition(xxx)
select 
xxx
,xxx
,case when a>80 then 0
when a>60 then 1
else 2 end as da
from(
select 
round((sum(xxx)/sum(xxx),4) as a
,xxx
,xxx
from yyy 
where (这里一般跟分区字段)
group by ...) da
group by
...

这里的where和group by是看具体情况而定的,里层出来最好去别名,当你的层数多了可以很好的分清。
ok!!!
结束
在这里插入图片描述
注:文中如有错误部分,还劳烦指正,谢谢哦。、


于2022/01/20修改
文中有错误部分
关于case when 后能否使用聚合函数的问题

case when count(xxx)>=2 then '123' else max(xxx) end as kkk

关于case when 后面跟聚合函数是完全可以的,只是需要同级别,比如说,你上面的例子
你在前面用了count聚合函数,那么then的时候就需要提高他的级别,我们假定一列是1级别,聚合函数是3级别,那么你在这个地方就能使用1级别的,你就必须使用3级别
但是我们使用的直接设定某个值,假如设定then ‘我是fw’ 这样写,完全是ok的,文字既可以是1也可以是3

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值