我想在Hive里找到一个数的阶乘。目前还没有Hive函数可以做到这一点,所以我试着写我自己的。这是我的密码:
package com.guy.hive.udf;
import org.apache.hadoop.hive.ql.exec.UDF;
import org.apache.hadoop.io.LongWritable;
import org.apache.commons.math3.util.ArithmeticUtils;
public final class Factorial extends UDF {
public LongWritable evaluate(final LongWritable s){
int n = (int) s.get();
int fact = (int) ArithmeticUtils.factorial(n);
return new LongWritable(fact);
}
}
运行此配置单元查询时:
select factorial(c) from (select count(*) as c from test_table) ;
我得到一个例外:
Caused by: org.apache.hadoop.hive.ql.metadata.HiveException: Unable to execute method public org.apache.hadoop.io.LongWritable com.vm.hive.udf.Factorial.evaluate(long) on object com.vm.hive.udf.Factorial@37483748 of class com.vm.hive.udf.Factorial with arguments {39514210:java.lang.Long} of size 1
有人能帮忙吗?
堆栈跟踪:
Caused by: org.apache.hadoop.hive.ql.metadata.HiveException: Unable to execute method public org.apache.hadoop.io.LongWritable com.vm.hive.udf.Factorial.evaluate(org.apache.hadoop.io.LongWritable) on object com.vm.hive.udf.Factorial@5faa5faa of class com.vm.hive.udf.Factorial with arguments {39514210:org.apache.hadoop.io.LongWritable} of size 1
at org.apache.hadoop.hive.ql.exec.FunctionRegistry.invoke(FunctionRegistry.java:1030)
at org.apache.hadoop.hive.ql.udf.generic.GenericUDFBridge.evaluate(GenericUDFBridge.java:181)
at org.apache.hadoop.hive.ql.exec.ExprNodeGenericFuncEvaluator._evaluate(ExprNodeGenericFuncEvaluator.java:166)
at org.apache.hadoop.hive.ql.exec.ExprNodeEvaluator.evaluate(ExprNodeEvaluator.java:77)
at org.apache.hadoop.hive.ql.exec.ExprNodeEvaluator.evaluate(ExprNodeEvaluator.java:65)
at org.apache.hadoop.hive.ql.exec.SelectOperator.processOp(SelectOperator.java:80)
at org.apache.hadoop.hive.ql.exec.Operator.process(Operator.java:504)
at org.apache.hadoop.hive.ql.exec.Operator.forward(Operator.java:842)
at org.apache.hadoop.hive.ql.exec.GroupByOperator.forward(GroupByOperator.java:1052)
at org.apache.hadoop.hive.ql.exec.GroupByOperator.flush(GroupByOperator.java:1077)
... 10 more
Caused by: java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:60)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:37)
at java.lang.reflect.Method.invoke(Method.java:611)
at org.apache.hadoop.hive.ql.exec.FunctionRegistry.invoke(FunctionRegistry.java:1006)
... 19 more
Caused by: org.apache.commons.math3.exception.MathArithmeticException: arithmetic exception
at org.apache.commons.math3.util.ArithmeticUtils.factorial(ArithmeticUtils.java:317)
at com.vm.hive.udf.Factorial.evaluate(Factorial.java:50)
... 24 more
[编辑1-将导入添加到java代码。]
[编辑2-添加stacktrace
1条答案
按热度按时间tjvv9vkg1#
我明白你的问题了。问题不在Hive里,而在算术里
factorial
方法。注意它抛出一个MathArithmeticException
? 根据文档,当“结果太大,无法用长的表示”时,就会出现这种情况你的案子一定是这样的。尝试向方法传递一个较小的数字。
另外,请注意
factorial
方法已弃用。文档建议改用combinationutils.factorialgo(int)方法。