【问题标题】:Hive UDFs, Java Primitives and nullHive UDF、Java Primitives 和 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”类型是完全有效和合法的。

标签: java hive user-defined-functions


【解决方案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 不是原始的。
猜你喜欢
  • 2014-08-05
  • 1970-01-01
  • 2016-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-12
  • 1970-01-01
相关资源
最近更新 更多