在 Hive 中,'positive' 函数有什么作用?

In Hive, what does the 'positive' function do?

我正在使用存储在 Hive 表中的数据开发基于项目的推荐系统,并且在 Sagar Prasad's blog 中偶然发现了类似的场景。我注意到他在 user/product.

的哈希值上使用了 POSITIVE 函数

我有点不明白为什么会有这个功能。 documentation 声明此函数采用 intdouble 和 returns 该值:

"positive(INT/DOUBLE a) returns a"

例如:

hive> select positive(-1);
-1

这是否意味着该函数什么都不做?还是我遗漏了一些细微的差别?

在幕后,此函数是 GenericUDFOPPositive.java,它扩展了 GenericUDFBaseUnary.javapositive 也可以简称为 +.

对于数字类型,这个函数确实没有做任何有效的事情。对于文本类型,它似乎试图转换为 double,因为 GenericUDFBaseUnary.java 包含以下内容:

private PrimitiveTypeInfo deriveResultTypeInfo(PrimitiveTypeInfo typeInfo) {
  switch(typeInfo.getPrimitiveCategory()) {
    case STRING:
    case VARCHAR:
    case CHAR:
      return TypeInfoFactory.doubleTypeInfo;
    default:
      return typeInfo;
  }
}

然而,这似乎并没有真正起作用,因为在字符串上调用 positive 只是 returns 字符串。这意味着至少,文档中此函数的类型签名是错误的,因为它接受的不仅仅是 doubleint.

不用担心被搞糊涂了,看了源码想弄明白这个函数是干什么用的,我现在也弄糊涂了为什么会存在!

https://github.com/apache/hive/blob/release-0.14.0/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFOPPositive.java

https://github.com/apache/hive/blob/release-0.14.0/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFBaseUnary.java