Hive 中简单 UDF 的奇怪行为
Strange behavior of simple UDF in Hive
我有一个配置单元 table,它是使用以下代码创建的:
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 类型 而不是 plain java 类型。比我重写和重建我的 UDF:
public Text reverse(Text str){
return new Text(new StringBuilder(str.toString())
.reverse().toString());
}
但这并没有帮助。 所以,我的错误在哪里?我应该如何更改 UDF 或查询来解决这个问题?
所以,我解决了我的问题。
实现 UDF 功能的方法(例如我的 UDF 中的 reverse()
)必须只调用 evaluate()
,不能调用其他任何东西!
我有一个配置单元 table,它是使用以下代码创建的:
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 类型 而不是 plain java 类型。比我重写和重建我的 UDF:
public Text reverse(Text str){
return new Text(new StringBuilder(str.toString())
.reverse().toString());
}
但这并没有帮助。 所以,我的错误在哪里?我应该如何更改 UDF 或查询来解决这个问题?
所以,我解决了我的问题。
实现 UDF 功能的方法(例如我的 UDF 中的 reverse()
)必须只调用 evaluate()
,不能调用其他任何东西!