【问题标题】:Using Hive UDF in Impala gives erroneous results in Impala 1.2.4在 Impala 中使用 Hive UDF 在 Impala 1.2.4 中会产生错误的结果
【发布时间】:2015-07-19 11:10:28
【问题描述】:

我有两个使用 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

【问题讨论】:

    标签: hadoop hive cloudera-cdh impala udf


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2019-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多