您的位置:首页 > 其它

将自定义函数集成到Hive的源码

2017-10-08 01:27 477 查看

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;






内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: