在Impala中使用Hive UDF会在Impala 1.2.4中产生错误的结果

时间:2015-05-08 13:46:52

标签: hadoop hive cloudera-cdh impala udf

我有两个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)的答案并没有给出 回原始答案)。

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

所以,我假设附加了一些额外的(特殊)字符 在Impala 1.2.4的myUDF输出结束时(恰好在最后 从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

1 个答案:

答案 0 :(得分:1)

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