0

我在 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因此,我假设在 Impala 1.2.4的输出末尾附加了一些额外的(特殊)字符(正好在Text从 UDF 函数返回的数据类型的末尾)。

我在 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

4

1 回答 1

1

这是在 Impala 2.1 中修复的IMPALA-1134 。问题是返回的值以错误的方式复制,因此可能会在字符串的末尾返回一些额外的内存。以前我们使用getBytes(),它表示只有最多的数据getLength()是有效的。我认为可以尝试在输出中编码实际长度,然后在您的反转函数中,取实际长度并仅使用有效部分。然而,这似乎相当棘手。我强烈建议找到一种方法来升级到最新版本的 Impala,因为自 1.4 以来有许多错误修复。

于 2015-05-08T16:38:05.213 回答