2017-11-06 11 views
0

E. CaprioloらのProgramming Hiveの168ページに、「... Javaプリミティブはオブジェクトではなく、nullにはなりません」と記載されています。だから、簡単なハイブUDF用:ハイブUDF、Javaプリミティブ、ヌル

public class ConvertToCelcius extends UDF { 
    public double evaluate(double value) { 
     return (value - 32)/1.8; 
     } 
} 

ヌル列値が検出された場合に何が起こりますか?

また、Javaプリミティブを使用して、nullがUDFに渡されるかどうかをテストする方法はありますか?

おそらく、我々は、上記のように書き換えることができます:私たちは、プリミティブデータとUDFを作成することができます

public class ConvertToCelcius extends UDF { 
    public Double evaluate(Double value) { 
     if (value == null) { 
      return null; 
     } 
     return (value - 32)/1.8; 
     } 
} 
+1

"*ヌルの行の値が見つかった場合はどうなりますか?*" =>コンパイルエラー - これを行うことはできません。あなたが 'Double'を渡さない限り、あなたはNPEを得るでしょう。 – assylias

+0

コンパイルエラーまたはランタイムエラー?上記の "double"コードは正常にコンパイルされます。 – user25029

+0

私が言っていることは、最初のメソッドで 'evaluate(null)'を呼び出すことができないということです:コンパイルエラーです。また、実行時に 'Double d = null'を渡すと、NullPointerExceptionが発生します。 – assylias

答えて

1

のみ入力して

select 
     CASE WHEN columnName = null then null 
       else evaluate(columnName) end columnName 
From tabelName 

注つまりSQL CASE文

にnull値をチェックします:evaluate UDF名です。

+0

"...プリミティブのデータ型のみでUDFを作成できます..."これは正しいとは思わない。私は倍数のリスト(例えばリスト)を持ついくつかのUDFを持っており、彼らは正常に動作します。しかし、Javaプリミティブにnullを渡さないように、クエリ側でnullをテストしなければならないというあなたの意見があります。 – user25029

+0

@ user25029これは、(例えば、リスト)事は、javaボクシングとunboxing機能により詳細です。 –

+0

私の意見は、リストはプリミティブではありません。 – user25029

関連する問題