简单UDF在Hive中的奇怪行为

时间:2015-04-18 15:15:16

标签: hive hiveql udf

我有一个使用此代码创建的配置单元表:

CREATE EXTERNAL TABLE IPRegions (
    ip STRING,
    -- other fields don't matter 
)

我需要使用自编写的UDF以相反的顺序输出每个ip是的,这是一个类似于SELECT ip FROM IPRegions 的非常简单的问题)。 为此,我编写了以下UDF:

public class ReverseUDF extends UDF {
    /**
     * Reversing of a string.
     * @param str input string
     * @return reversed string
     */
    public String reverse(String str){
        return new StringBuilder(str).reverse().toString();
    }
}

我用这个UDF构建了jar - 文件而不是写了这样的查询:

USE my_base;
add jar Reverser/jar/Reverser.jar;
create temporary function reverse as 'com.lab4udf.ReverseUDF';

select reverse(ip)
from IPRegions;

但是我有一个例外:

FAILED: SemanticException [Error 10014]: Line 3:7 Wrong arguments 'ip': No matching method for class com.lab4udf.ReverseUDF with (string).

正如我在许多示例中看​​到的,在UDF中经常使用 hadoop类型而不是普通java类型。比我重写并重建我的UDF:

public Text reverse(Text str){
        return new Text(new StringBuilder(str.toString())
                .reverse().toString());
}

但它没有帮助。 那么,我的错误在哪里?我应该如何更改UDF或查询以解决此问题?

1 个答案:

答案 0 :(得分:0)

所以,我解决了我的问题。

实现UDF功能的方法(例如我的UDF中的reverse())必须只调用evaluate()而不是其他任何内容!