1. Hive自定义函数介绍
当Hive提供的内置函数无法满足你的业务处理需要时,此时可以考虑使用用户自定义函数(UDF: user-defined function)。
Hive 中常用的UDF有如下三种:
- UDF
一条记录使用函数后输出还是一条记录,比如:upper/substr; - UDAF(User-Defined Aggregation Funcation)
多条记录使用函数后输出还是一条记录,比如: count/max/min/sum/avg; - UDTF(User-Defined Table-Generating Functions)
一条记录使用函数后输出多条记录,比如: lateral view explore();
2. Hive自定义函数开发
需求:开发自定义函数,使得在指定字段前加上“Hello:”字样。Hive 中 UDF函数开发步骤:
(1)继承UDF 类。
(2)重写evaluate方法,该方法支持重载,每行记录执行一次evaluate方法。
注意:
1 UDF必须要有返回值,可以是null,但是不能为 void.
2 推荐使用 Text/LongWritable等Hadoop的类型,而不是Java类型(当然使用 Java类型也是可以的)。
功能实现:
添加依赖包。
<properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <hadoop.version>2.6.0-cdh5.7.0</hadoop.version> <hive.version>1.1.0-cdh5.7.0</hive.version> </properties>
<repositories> <repository> <id>cloudera</id> <url>https://repository.cloudera.com/artifactory/cloudera-repos/</url> </repository> </repositories>
<dependencies>
<dependency> <groupId>org.apache.hadoop</groupld> <artifactId>hadoop-common</artifactld> <version>$ {hadoop.version}</version> </dependency>
<dependency> <groupld>org.apache.hive</groupld> <artifactId>hive-exec</artifactId> <version>$ { hive.version}</version> </dependency>
<dependency> <groupld>org.apacne.hive</groupId> <artifactld>hive-jdbc</artifactId> <version>$ { hive.version}</version> </dependency> </dependencies>
|
开发UDF函数。
package com.kgc.bigdata.hadoop.hive; import org.apache.hadoop.hive.ql.exec.UDF; import org.apache.hadoop.io.IntWritable; import org.apache.hadoop.io.Text;
public class HelloUDF extends UDF{
public Text evaluate(Text name){ return new Text("Hello: " + name); } public Text evaluate(Text name,IntWritable age){ return new Text("Hello: " +name + " , age :" + age); } /功能测试 public static void main(String[] args){ HelloUDF udf = new HelloUDF( System.out.println(udf.evaluate(new Text("zhangsan"))); System.out.println(udf.evaluate(new Text("zhangsan"), new IntWritable(20))); } }
|
(3)编译jar包上传到服务器。
(4)将自定义UDF 函数添加到Hive 中去。
add JAR/home/hadoop/lib/hive-1.0.jar; create temporary function sayHello as 'com.kgc.bigdata.hadoop.hive.HelloUDF';
|
(5)使用自定义函数。
//通过show functions可以看到我们自定义的sayHello函数show functions;
//将员工表的ename作为自定义UDF函数的参数值,即可查看到最终的输出结果
select empno, ename, sayHello(ename) from emp;
|
原文:https://github.com/heibaiying/BigData-Notes