执行自定义udf时出错

时间:2017-11-17 05:38:00

标签: hive user-defined-functions

您好我有一个hive表,它从sqoop获取数据,因此有一个字符串字段fc,它有空值。所有其他值都以数字的形式出现。 我已经编写了一个UDF,以便我可以获得值1000,如果该列中有null,如果它不是null,我应该使用相同的值。我的udf代码如下所示

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)

任何帮助都会非常感激。

1 个答案:

答案 0 :(得分:0)

您输入的文本/字符串无论您作为参数传递给您的函数,都可能包含" null"本身只是字符串或文本的形式。 这意味着你试图比较" null"(这是一个字符串)为null,所以它总是会给你一个错误的结果。

所以在这种情况下,如果输入是" null"(String)它将永远不会等于null,如果为false,则将该字符串解析为Int .Hence,您将获得java.lang.NumberFormatException:对于输入字符串:" null"所以你可以检查null和" null"。

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