0

我是为 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());
	  }
}

我必须根据不同的输入参数编写不同的评估实现。

我的查询是 - 我如何在一个类中编写多个评估方法。我需要为不同的方法编写不同的类吗?如果我在单个类中编写这些覆盖的方法,那么 Hive 将如何在包含相同类型参数的不同方法之间有所不同。

请指导我正确的方法。

4

2 回答 2

1

在 hive 中,您可以重载与 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 的更多信息,请访问此页面

于 2015-03-23T14:06:24.323 回答
0

这种类型的重载可能吗?

喜欢 -

public class ExampleUDF extends UDF{

    public Integer evaluate(Integer num) {
        return num*2;

    }

    public Integer evaluate(Integer num1, Integer num2) {
        return num1*num2;
    }
}
于 2019-10-16T11:40:31.243 回答