在 Impala 中使用 Hive UDF 在 Impala 1.2.4 中给出了错误的结果

Using Hive UDF in Impala gives erroneous results in Impala 1.2.4

我在 Java 中有两个有效的 Hive UDF 在 Hive 中非常好。

两种功能互为补充。

String myUDF(BigInt)
BigInt myUDFReverso(String)

myUDF("myInput") 给出一些输出 当 myUDFReverso(myUDF("myInput")) 应该回馈 myInput

这在 Hive 中有效,但是当我尝试使用 它在 Impala(版本 1.2.4)中给出了预期的 myUDF(BigInt) 的答案(打印的答案是正确的) 但是传递给 myUDFReverso(String) 的答案没有给出 返回原始答案)。

我注意到 length(myUDF("myInput")) 在 Impala 1.2.4 是错的。每行+1。然后再次 它在 Hive 和 Impala(版本 2.1)

的情况下是正确的

所以,我假设附加了一些额外的(特殊)字符 在 myUDF in Impala 1.2.4 的输出末尾(恰好在末尾 UDF 函数返回的 Text 数据类型)。

我在 Cpp 中为 Impala 1.2.4 构建了一个类似的 UDF,它工作正常。

所有这些问题都在 Impala 2.1 中解决了,但我不能 将我的集群升级到它。

那么我该如何解决这个错误?

参考:http://www.cloudera.com/content/cloudera/en/documentation/cloudera-impala/v1/v1-2-4/Installing-and-Using-Impala/ciiu_udf.html

这是 IMPALA-1134 which was fixed in Impala 2.1. The issue is that the returned value is copied in the wrong way such that some extra memory may be returned at the end of your string. Previously we were using getBytes() 表示只有 getLength() 之前的数据有效。我认为可以尝试在输出中编码真实长度,然后在你的反转函数中,采用真实长度并且只使用有效部分。然而,这似乎很棘手。我强烈建议找到一种方法来升级到最新版本的 Impala,因为自 1.4 以来修复了许多错误。