I write a hive genericUDF class, which returns a decimal value after evaluate.
Here is my UDF code:
public class MyUDF extends GenericUDF {
@Override
public ObjectInspector initialize(ObjectInspector[] arguments) throws UDFArgumentException {
if (arguments.length < 1) {
throw new UDFArgumentException("myUDF() requires at least one argument.");
}
return PrimitiveObjectInspectorFactory.getPrimitiveJavaObjectInspector(TypeInfoFactory.getDecimalTypeInfo(10, 2));
}
@Override
public Object evaluate(DeferredObject[] arguments) throws HiveException {
if (arguments[0] == null) {
return null;
}
int value = (Integer) arguments[0].get();
// do something
return HiveDecimal.create(value);
}
@Override
public String getDisplayString(String[] children) {
return getStandardDisplayString("myUDF", children);
}
}
when i run this function in hive, it shows error like :
FAILED: RuntimeException Error creating PrimitiveTypeInfo instance for decimal
java.lang.RuntimeException: Error creating PrimitiveTypeInfo instance for decimal
at org.apache.hadoop.hive.serde2.typeinfo.TypeInfoFactory.getPrimitiveTypeInfo(TypeInfoFactory.java:111)
at org.apache.hadoop.hive.serde2.typeinfo.TypeInfoFactory.getPrimitiveTypeInfoFromJavaPrimitive(TypeInfoFactory.java:190)
at org.apache.hadoop.hive.ql.plan.ExprNodeConstantDesc.(ExprNodeConstantDesc.java:76)
at org.apache.hadoop.hive.ql.optimizer.ConstantPropagateProcFactory.evaluateFunction(ConstantPropagateProcFactory.java:990)
at org.apache.hadoop.hive.ql.optimizer.ConstantPropagateProcFactory.foldExprFull(ConstantPropagateProcFactory.java:425)
at org.apache.hadoop.hive.ql.optimizer.ConstantPropagateProcFactory.foldExpr(ConstantPropagateProcFactory.java:263)
at org.apache.hadoop.hive.ql.optimizer.ConstantPropagateProcFactory.foldExprFull(ConstantPropagateProcFactory.java:413)
at org.apache.hadoop.hive.ql.optimizer.ConstantPropagateProcFactory.foldExpr(ConstantPropagateProcFactory.java:263)
at org.apache.hadoop.hive.ql.optimizer.ConstantPropagateProcFactory.foldExprFull(ConstantPropagateProcFactory.java:413)
I try to read hive2.3 source code. It seems like there is a bug in “org.apache.hadoop.hive.serde2.typeinfo.TypeInfoFactory.getPrimitiveTypeInfoFromJavaPrimitive”. When i run: TypeInfoFactory.getPrimitiveTypeInfoFromJavaPrimitive(HiveDecimal.class), it shows same error.
So how can i return decimal in generic UDF?