Hive中自定义函数概述
在工作中,Hive的内置函数,远远不能满足需求,因此需要自定义函数
UDF: 用户自定义 one-to-one(一进一出,一对一)
UDAF: many-to-one(多对一)
UDTF: one-to-many(一进多出)
自定义函数的开发需要按照Hive的要求,见下图:
Hive源码下载
版本:hive-1.1.0-cdh5.7.0-src.tar.gz
地址:http://archive.cloudera.com/cdh5/cdh/5/hive-1.1.0-cdh5.7.0-src.tar.gz
UDF函数的编写
编写SayHello.java文件,将其保存到$HIVE_HOME/ql/src/java/org/apache/hadoop/hive/ql/udf路径之下
package org.apache.hadoop.hive.ql.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 = "SayHello",
value = "_FUNC_(input_str) - returns the Hello: input_str",
extended = "Example:\n "
+ " > SELECT _FUNC_('zhangsan') FROM src LIMIT 1;\n"
+ " 'Hello: zhangsan'\n")
public class SayHello extends UDF{
public Text evaluate(Text input){
return new Text("Hello: " + input);
}
}
修改FunctionRegistry.java
路径:$HIVE_HOME/ql/src/java/org/apache/hadoop/hive/ql/exec/FunctionRegistry.java
...
import org.apache.hadoop.hive.ql.udf.SayHello;
...
// registry for system functions
private static final Registry system = new Registry(true);
static {
system.registerGenericUDF("concat", GenericUDFConcat.class);
system.registerUDF("SayHello", SayHello.class, false);
system.registerUDF("substr", UDFSubstr.class, false);
system.registerUDF("substring", UDFSubstr.class, false);
system.registerUDF("space", UDFSpace.class, false);
编译Hive源码
$>cd $HIVE_HOME
$>mvn clean package -DskipTests -Phadoop-2 -Pdist
编译成功截图:
Hive部署
具体部署参见博文:Hive的产生背景 & 概述 & 发展历程 & 架构 & 部署及简单入门
测试
hive>show functions;