重写自定义配置单元UDF中的评估方法

时间:2015-03-23 12:21:05

标签: hadoop hive user-defined-functions

我是新手为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将在包含相同类型参数的不同方法之间有所不同。

请指导我正确的方法。

2 个答案:

答案 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;
    }
}