配置单元UDF、Java原语和null

配置单元UDF、Java原语和null,java,hive,user-defined-functions,Java,Hive,User Defined Functions,在E.Capriolo等人编写的编程配置单元的第168页上,它指出“……在Java中,原语不是对象,不能为null。”因此,对于简单的配置单元UDF: public class ConvertToCelcius extends UDF { public double evaluate(double value) { return (value - 32) / 1.8; } } 如果遇到空行值,会发生什么情况 另外,使用Java原语,我们如何测试null是否传

在E.Capriolo等人编写的编程配置单元的第168页上,它指出“……在Java中,原语不是对象,不能为null。”因此,对于简单的配置单元UDF:

public class ConvertToCelcius extends UDF {
    public double evaluate(double value) {
        return (value - 32) / 1.8;
      }
}
如果遇到空行值,会发生什么情况

另外,使用Java原语,我们如何测试null是否传递给我们的UDF

我们可以将上述内容改写为:

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

我们可以仅使用原语数据类型创建UDF,并在sql Case语句中检查null值


注意:evaluate是UDF名称。

“如果遇到空行值会发生什么?”=>编译错误-不可能这样做。除非您传递一个
Double
,在这种情况下,您将得到一个NPE.Compile错误或运行时错误?上面带有“double”的代码编译得很好。我的意思是,在第一个方法:compile error上不能调用
evaluate(null)
。如果您在运行时传递一个
Double d=null
,您将得到一个NullPointerException。这就是我问题背后的全部要点。“evaluate(double value)”编译很好,可以打包到jar中并在脚本中使用,但是当传递空值时会发生什么?这是“双重”而不是“双重”。使用类型“double”是完全有效和合法的…我们只能用原语数据类型创建UDF…“我认为这是不对的。我有几个UDF和双倍列表(例如List),它们工作得很好。但是,我明白您的观点,即必须在查询端测试null,以便不将null传递给Java原语。@user25029由于Java装箱和拆箱功能的更详细信息,这(例如列表)工作正常。我同意,但我的观点是列表不是原始的。
select 
      CASE WHEN columnName = null then null 
               else evaluate(columnName) end columnName
 From tabelName