2017-11-17 21 views
0

こんにちは私はnull値を持っている文字列フィールドfcがあるので、sqoopからデータを持っているハイブテーブルを持っています。他のすべての値は数値の形式です。私は値が1000を持ってもらうことができるように、私はUDFを書かれている があり、その列のnullで、それがnullではない場合、私は同じvalue.MyのUDFコードがカスタム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 [email protected] 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) 

本当にありがとうございます。

答えて

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()); 
     } 
関連する問題