一、编译目的
hive自带了很多内置函数,但是这些函数并不能满足我们的日常工作。当我们频繁需要使用一个函数而hive又没有时就需要我们自定义函数了。
二、UDF(user defined function)函数构建步骤
1、自定义一个Java类
2、继承UDF类
3、重写evaluate方法
4、打成jar包
6、在hive执行add jar方法
7、在hive执行创建模板函数
8、hql中使用
三、使用idea+maven构建
1、pom文件加入以下信息
<properties>
<project.build.sourceEncoding>UTF8</project.build.sourceEncoding>
<!--Hadoop版本更改成自己的版本-->
<hadoop.version>2.6.0-cdh5.7.0</hadoop.version>
<hive.version>1.1.0-cdh5.7.0</hive.version>
</properties>
<!--加入Hadoop原生态的maven仓库的地址-->
<repository>
<id>Apache Hadoop</id>
<name>Apache Hadoop</name>
<url>https://repo1.maven.org/maven2/</url>
</repository>
<!--加入cdh的maven仓库的地址-->
<repository>
<id>cloudera</id>
<name>cloudera</name>
<url>https://repository.cloudera.com/artifactory/cloudera-repos/</url>
</repository>
</repositories>
<dependencies>
<!--添加hadoop依赖-->
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-common</artifactId>
<version>${hadoop.version}</version>
</dependency>
<!--添加hive依赖-->
<dependency>
<groupId>org.apache.hive</groupId>
<artifactId>hive-exec</artifactId>
<version>${hive.version}</version>
</dependency>
2、自定义java类
package com.ruozedata.hive;
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 Hello:input",
extended = "Example:\n "
+ " > SELECT _FUNC_('zhangsan') FROM src LIMIT 1;\n"
+ " 'Hello:zhangsan'")
// 继承UDF类
public class HelloUDF2 extends UDF{
//重写evaluate方法
public Text evaluate(Text input){
return new Text("Hello:"+input);
}
public static void main(String[] args) {
HelloUDF2 UDF=new HelloUDF2();
System.out.print(UDF.evaluate(new Text("zhangsan")));
}
}
3、打成jar包
在自己项目D:\hdoopspace\target目录下
hive-train-1.0.jar
4、将jar包上传并添加到hive
hive (default)> add jar /tmp/data/hive-train-1.0.jar;
5、创建模板函数
hive (default)>CREATE TEMPORARY FUNCTION sayHello AS 'com.ruozedata.hive.HelloUDF2';
6、hql使用UDF
hive (default)> select ename,sayhello(ename) from emp;
OK
ename _c1
SMITH Hello:SMITH
ALLEN Hello:ALLEN
WARD Hello:WARD
JONES Hello:JONES
MARTIN Hello:MARTIN
BLAKE Hello:BLAKE
CLARK Hello:CLARK
SCOTT Hello:SCOTT
KING Hello:KING
TURNER Hello:TURNER
ADAMS Hello:ADAMS
JAMES Hello:JAMES
FORD Hello:FORD
MILLER Hello:MILLER
HIVE Hello:HIVE
Time taken: 0.131 seconds, Fetched: 15 row(s)
四、注意点
以上方法只是单session的而且是临时有效的,也就是只在当前session有用。后续会给大家奉上将UDF函数注册到hive源码当中,那么自己写的函数也就成了hive的内置函数了。