执行自定义udf时出错

rn0zuynd  于 2021-06-26  发布在  Hive
关注(0)|答案(1)|浏览(466)

嗨,我有一个配置单元表,它从sqoop获取数据,所以有一个字符串字段fc,它有空值。所有其他值都是数字形式。我已经写了一个自定义项,这样我可以得到的值有1000是有空在该列,如果它不是空的,我应该相同的值。我的自定义项代码如下所示

package com.cascrmg.customudf;

import org.apache.hadoop.hive.ql.exec.UDF;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;

public class sample extends UDF {
    int returnVal;

    // Accept a string input
    public int evaluate(Text input) {
        // If the value is null, return a 1000
        if (input == null) {
            returnVal = 1000;
        } else {
            returnVal = Integer.parseInt(input.toString());
        }
        // Lowercase the input string and return it
        return returnVal;
    }
}

但是当我添加它并尝试执行它时,我会得到以下错误。

Caused by: org.apache.hadoop.hive.ql.metadata.HiveException: Unable to execute method public int com.cascrmg.customudf.sample.evaluate(org.apache.hadoop.io.Text)  on object com.cascrmg.customudf.sample@408e96d9 of class com.cascrmg.customudf.sample with arguments {null:org.apache.hadoop.io.Text} of size 1
        at org.apache.hadoop.hive.ql.exec.FunctionRegistry.invoke(FunctionRegistry.java:993)
        at org.apache.hadoop.hive.ql.udf.generic.GenericUDFBridge.evaluate(GenericUDFBridge.java:182)
        at org.apache.hadoop.hive.ql.exec.ExprNodeGenericFuncEvaluator._evaluate(ExprNodeGenericFuncEvaluator.java:186)
        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:77)
        at org.apache.hadoop.hive.ql.exec.Operator.forward(Operator.java:815)
        at org.apache.hadoop.hive.ql.exec.TableScanOperator.processOp(TableScanOperator.java:97)
        at org.apache.hadoop.hive.ql.exec.MapOperator$MapOpCtx.forward(MapOperator.java:157)
        at org.apache.hadoop.hive.ql.exec.MapOperator.process(MapOperator.java:497)
        ... 9 more
Caused by: java.lang.reflect.InvocationTargetException
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:497)
        at org.apache.hadoop.hive.ql.exec.FunctionRegistry.invoke(FunctionRegistry.java:969)
        ... 18 more
Caused by: java.lang.NumberFormatException: For input string: "null"
        at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
        at java.lang.Integer.parseInt(Integer.java:580)
        at java.lang.Integer.parseInt(Integer.java:615)
        at com.cascrmg.customudf.sample.evaluate(sample.java:16)

任何帮助都将不胜感激。

hiz5n14c

hiz5n14c1#

您的输入文本/字符串无论您作为参数传递给您的函数可能包含“null”本身是字符串或文本的形式。这意味着您试图将“null”(一个字符串)与null进行比较,因此它总是会给您一个错误的结果。
因此,在这种情况下,如果输入为“null”(string),它将永远不等于null,如果为false,则将该字符串解析为int。

if (input == null||input=="null") {   
            returnVal = 1000;
        } else {
            returnVal = Integer.parseInt(input.toString());
        }

相关问题