Hive UDF - evaluate() 方法中的错误
Hive UDF - Error in the evaluate() Method
我创建了以下 Java class 并在制作 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;
并得到同样的错误。有人可以帮我解决这个问题吗?
尝试将 Hadoop 的 Text
类型替换为简单的 Java 的 String
输入类型和 return 类型。对于 UDF
class 它工作正常。如果你想坚持使用 Text
我认为你需要初始化你的私有变量 t
,例如
private final transient t = new Text()
这是 Hive 的 UDF 的 example code。
我创建了以下 Java class 并在制作 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;
并得到同样的错误。有人可以帮我解决这个问题吗?
尝试将 Hadoop 的 Text
类型替换为简单的 Java 的 String
输入类型和 return 类型。对于 UDF
class 它工作正常。如果你想坚持使用 Text
我认为你需要初始化你的私有变量 t
,例如
private final transient t = new Text()
这是 Hive 的 UDF 的 example code。