我是新手为hive编写自定义udf。我试过成功地为toupper函数编写自定义udf。
import org.apache.hadoop.hive.ql.exec.Description;
import org.apache.hadoop.hive.ql.exec.UDF;
import org.apache.hadoop.io.Text;
@Description(
name="SimpleUDFExample",
value="returns 'hello x', where x is whatever you give it (STRING)",
extended="SELECT simpleudfexample('world') from foo limit 1;"
)
class SimpleUDFExample extends UDF {
public Text evaluate(Text input) {
if(input == null) return null;
return new Text("Hello " + input.toString());
}
}
我必须根据不同的输入参数编写不同的evaluate实现。
我的查询是 - 如何在单个类中编写多个评估方法。我是否需要为不同的方法编写不同的类?如果我在单个类中编写这些重写方法,那么How Hive将在包含相同类型参数的不同方法之间有所不同。
请指导我正确的方法。
答案 0 :(得分:1)
在配置单元中,您可以重载与JAVA相同的方法。但是在UDF中你必须使用Hadoop数据类型,比如IntWritable,FloatWritable ......
请在下面找到代码。
public class ToUpper extends UDF{
public String evaluate(Text word) {
String upperCase=word.toString();
return upperCase;
}
public String evaluate(IntWritable word) {
String upperCase="Error : Input type is Integer. Cannot convert to UpperCase";
return upperCase;
}
public String evaluate(FloatWritable word) {
String upperCase="Error : Input type is Float. Cannot convert to UpperCase";
return upperCase;
}
public String evaluate(LongWritable word) {
String upperCase="Error : Input type is Long. Cannot convert to UpperCase";
return upperCase;
}
}
有关UDF的更多信息,请访问this page
答案 1 :(得分:0)
这种类型的重载可能吗?
像-
public class ExampleUDF extends UDF{
public Integer evaluate(Integer num) {
return num*2;
}
public Integer evaluate(Integer num1, Integer num2) {
return num1*num2;
}
}