Hive UDF - evaluate() 方法中的错误

Posted

技术标签:

【中文标题】Hive UDF - evaluate() 方法中的错误【英文标题】:Hive UDF - Error in the evaluate() Method 【发布时间】:2019-01-28 10:19:43 【问题描述】:

我创建了以下 Java 类,并在用它制作了一个 jar 后将其添加到 Hive

import org.apache.hadoop.hive.ql.exec.UDF;
import org.apache.hadoop.io.Text;

public class MakeCap extends UDF
  private Text t;

  public Text evaluate(Text input)
    if(null==input)
      t.set("Invalid input");
    else
      t.set(input.toString().toUpperCase());
    
    return t;
  

接下来,我创建了一个临时函数

CREATE TEMPORARY FUNCTION CAP AS 'com.iris.MakeCap';

但是当我运行时

SELECT CAP('hello');

我收到以下错误

Error: Error while compiling statement: FAILED: SemanticException [Error 10014]: Line 1:7 Wrong arguments ''hello'': org.apache.hadoop.hive.ql.metadata.HiveException: 
Unable to execute method public org.apache.hadoop.io.Text com.iris.MakeCap.evaluate(org.apache.hadoop.io.Text) 
with arguments hello:null (state=42000,code=10014)

我尝试使用String 而不是Text 作为evaluate() 的参数类型,但得到了相同的结果。然后我也尝试了这个

SELECT CAP(e.name) FROM default.emp e;

并得到同样的错误。有人可以帮我解决这个问题吗?

【问题讨论】:

【参考方案1】:

尝试将 Hadoop 的 Text 类型替换为简单的 Java 的 String 类型,用于输入和返回。对于UDF 类,它工作正常。如果您想坚持使用Text,我认为您需要初始化您的私有变量t,例如

private final transient t = new Text()

这是 Hive 的 UDF 的 example code。

【讨论】:

以上是关于Hive UDF - evaluate() 方法中的错误的主要内容,如果未能解决你的问题,请参考以下文章

Hive函数(UDF篇)

hive之udf函数的使用

[Hive]Hive自定义函数UDF

Hive自定义函数UDF和UDTF

Hadoop_UDF示例

hive里的用户定义函数UDF