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