嗨,我有一个配置单元表,它从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)
任何帮助都将不胜感激。
1条答案
按热度按时间hiz5n14c1#
您的输入文本/字符串无论您作为参数传递给您的函数可能包含“null”本身是字符串或文本的形式。这意味着您试图将“null”(一个字符串)与null进行比较,因此它总是会给您一个错误的结果。
因此,在这种情况下,如果输入为“null”(string),它将永远不等于null,如果为false,则将该字符串解析为int。