《小小数据分析师的踩坑贴》系列 积累、总结自己工作日常中踩过的坑,希望以后不再遇到~ 🌟
?? 今天是Percentile函数在Hive中的使用,percentile() 🆚 percentile_approx()
报错:Hive query failed, Error while compiling statement: FAILED: NoMatchingMethodException No matching method for class org.apache.hadoop.hive.ql.udf.UDAFPercentile with (double, double). Possible choices: FUNC(bigint, array) FUNC(bigint, double)
?? 如果我的总结对你有帮助,请点赞👍支持哦,谢谢!! 欢迎留言交流~~ 一起进步 💦
?? 「更多我的踩坑贴」 小小数据分析师的踩坑贴 | 文章集合
一、背景
- 需求:计算 某浮点型变量的分位数值(50、80、90分位数)
- 做法:在hive脚本中,使用percentile 函数
- 报错:Hive query failed, Error while compiling statement: FAILED: NoMatchingMethodException No matching method for class org.apache.hadoop.hive.ql.udf.UDAFPercentile with (double, double). Possible choices: FUNC(bigint, array) FUNC(bigint, double)
二、分析报错的原因 🔍
1、首先看懂报错讲的是什么: FAILED: NoMatchingMethodException No matching method for class org.apache.hadoop.hive.ql.udf.UDAFPercentile with (double, double). Possible choices: FUNC(bigint, array) FUNC(bigint, double) -》Percentile 函数错了 -〉具体怎么错的: 我用的是Percentile with (double, double),但是可行的方法是 Possible choices: FUNC(bigint, array) FUNC(bigint, double)
2、定位报错原因: 根据报错提示,可以知道 是 数据类型出了问题?? Possible choices: FUNC(bigint, array) FUNC(bigint, double) -》如果要用percentile函数,则传入变量的数据类型应该为 bigint。而我传入的变量是浮点型的数据。 -》因此,要么更改数据类型,要么使用其他函数。
三、解决方案 😄
1、根据以上分析,两种解决办法:要么更改数据类型,要么使用其他函数。
2、但根据实际情况,变量一定要保持浮点型数据,不可能修改成bigint。所以,只能使用其他函数代替percentile()。
3、 percentile() 🆚 percentile_approx()
- percentile(col, p):percentile要求输入的字段必须是int类型的
- percentile_approx(col, p):percentile_approx则是数值类似型的都可以 ;
4、解决方案:使用 percentile_approx()
?? 如果我的总结对你有帮助,请点赞👍支持哦,谢谢!! 欢迎留言交流~~ 一起进步 💦
|