irpas技术客

No matching method for class org.apache.hadoop.hive.ql.udf.generic.GenericUDFOPD

irpas 851

项目场景:

在进行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


1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,会注明原创字样,如未注明都非原创,如有侵权请联系删除!;3.作者投稿可能会经我们编辑修改或补充;4.本站不提供任何储存功能只提供收集或者投稿人的网盘链接。

标签: #no #matching #method #for #class