Hive UDF、Java Primitives 和 null

Posted

技术标签:

【中文标题】Hive UDF、Java Primitives 和 null【英文标题】:Hive UDFs, Java Primitives and null 【发布时间】:2017-11-06 09:50:29 【问题描述】:

在 E. Capriolo 等人的 Programming Hive 第 168 页上,它指出“......在 Java 中,原语不是对象,不能为空。”所以,对于简单的 Hive 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;
      
 

【问题讨论】:

"如果遇到空行值会怎样?" => 编译错误 - 不可能这样做。除非您通过 Double,否则您将获得 NPE。 编译错误还是运行时错误?上面带有“double”的代码编译得很好。 我的意思是你不能在第一种方法上调用evaluate(null):编译错误。如果你在运行时传递一个Double d = null,你会得到一个 NullPointerException。 这是我问题的重点。 "evaluate(double value)" 编译得很好,可以打包到 jar 中并在脚本中使用,但是当传递空值时会发生什么?那是“双”而不是“双”。使用“double”类型是完全有效和合法的。 【参考方案1】:

我们可以只创建原始数据类型的UDF,并在sql Case Statement中检查空值

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

注意:评估是 UDF 名称。

【讨论】:

"...我们只能使用原始数据类型创建 UDF..." 我认为这是不正确的。我有几个带有双精度列表的 UDF(例如 List),它们工作正常。但是,我明白您关于必须在查询端测试 null 以免将 null 传递给 Java 原语的观点。 @user25029 由于 java 装箱和拆箱功能更详细,这(例如 List)正在工作。 docs.oracle.com/javase/tutorial/java/data/autoboxing.html 我同意,但我的意思是 List 不是原始的。

以上是关于Hive UDF、Java Primitives 和 null的主要内容,如果未能解决你的问题,请参考以下文章

hive自定义函数(UDF)

如何在 Java 的 UDF 中获取 hive 变量的值?

Hive UDF - Java 字符串转换异常

hive 自定义函数(udf)

使用 jRuby 编写 Hive UDF

Hive自定义UDF函数