前言:本文详解介绍UDF编程过程,以及hive中创建UDF函数的两种方式
文章目录
1.什么是udf
UDF(User-Defined Functions)即是用户自定义的hive函数。hive自带的函数并不能完全满足业务的需求,这时就需要我们自定义函数了。
官网参考地址:LanguageManual UDF
1.1UDF分类
- UDF: one to one ,进来一个出去一个,row mapping。 是row级别操作,如:upper、substr函数
- UDAF: many to one,进来多个出去一个,row mapping。是row级别操作,如sum/min。A:aggregation
- UDTF:one to mang,进来一个出去多行。如lateral view 与 explode,T:table-generating
本文这里只记录UDF类型函数的编程以及集成。
2.UDF编程示列
首先创建一个普通的maven工程,maven工程创建网上有很多资料,也很简单,这里就跳过了。
2.1pom依赖
pom文件如下,主要是添加hive-exec的jar包
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.wsk.bigdata</groupId>
<artifactId>g6-hadoop</artifactId>
<version>1.0</version>
<name>g6-hadoop</name>
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<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>
<!--添加CDH的仓库-->
<repositories>
<repository>
<id>nexus-aliyun</id>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</repository>
<repository>
<id>cloudera</id>
<url>https://repository.cloudera.com/artifactory/cloudera-repos</url>
</repository>
</repositories>
<dependencies>
<!--添加Hadoop的依赖-->
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
<version>${hadoop.version}</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<!--添加hive依赖-->
<dependency>
<groupId>org.apache.hive</groupId>
<artifactId>hive-exec</artifactId>
<version>${hive.version}</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.4</version>
<configuration>
<source>1.7</source>
<target>1.7</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</build>
</project>
2.2UDF编程
主要是通过集成UDF类,编写evaluate方法实现UDF编程,如下HelloUDF类
package com.wsk.bigdata.udf;
import org.apache.hadoop.hive.ql.exec.UDF;
public class HelloUDF extends UDF {
public String evaluate(String value) {
return "hello:" + value;
}
public static void main(String[] args) {
HelloUDF helloUDF = new HelloUDF();
String value = helloUDF.evaluate("wsk");
System.out.println(value);
}
}
2.3打jar包
打包
生成的jar包
3.创建UDF函数
创建UDF函数有三种方式
- 创建临时的UDF函数,只对当前session生效
- 创建永久的UDF函数
- 编译hive源码支持UDF函数,对所有部署编译后的hive生效。
3.1创建临时的UDF函数
生产不推荐
#上传jar包
[hadoop@hadoop001 lib]$ rz
[hadoop@hadoop001 lib]$ ll
total 12
-rw-r--r--. 1 hadoop hadoop 11447 Apr 19 2019 g6-hadoop-1.0.jar
#创建临时的UDF函数
若不想执行add操作可以将jar复制到 $HIVE_HOME/auxlib 特定的目录
ADD JAR /home/hadoop/lib/g6-hadoop-1.0.jar;
CREATE TEMPORARY FUNCTION sayHello_1 AS 'com.wsk.bigdata.udf.HelloUDF';
我这里报异常,异常信息: Unsupported major.minor version 52.0
思索后想起,我部署的jdk用的是1.7,而我编译UDF用的是jdk1.8,低版本环境是无法运行高版本jar的,重新部署1.8的jdk重启hadoop,同时降低UDFjar包编译的版本
#测试,临时函数只对当前session生效
hive> select sayHello_1("wsk") ;
OK
hello:wsk
Time taken: 0.175 seconds, Fetched: 1 row(s)
#检查mysql中的元数据,因为是临时函数,故元数据中并没有相关的信息
mysql> select * from funcs;
Empty set (0.11 sec)
降低项目编译版本方法,如下运行的是jdk1.8环境,编译使用的是1.7环境
3.2创建永久生效的UDF函数
通过上传hdfs实现。
#将jar上传到指定目录
[hadoop@hadoop001 ~]$ hdfs dfs -ls /lib
[hadoop@hadoop001 ~]$ hdfs dfs -put ~/lib/g6-hadoop-1.0.jar /lib/
[hadoop@hadoop001 ~]$ hdfs dfs -ls /lib
Found 1 items
-rw-r--r-- 1 hadoop supergroup 11543 2019-04-15 01:43 /lib/g6-hadoop-1.0.jar
#创建永久生效的UDF函数
CREATE FUNCTION sayhello_2 AS 'com.wsk.bigdata.udf.HelloUDF'
USING JAR 'hdfs://hadoop001:9000/lib/g6-hadoop-1.0.jar';
#测试
hive> select sayHello_2("wsk2") ;
OK
hello:wsk2
#检查mysql中的元数据,测试函数的信息已经注册到了元数据中
mysql> select * from funcs;
+---------+------------------------------+-------------+-------+------------+-----------+------------+------------+
| FUNC_ID | CLASS_NAME | CREATE_TIME | DB_ID | FUNC_NAME | FUNC_TYPE | OWNER_NAME | OWNER_TYPE |
+---------+------------------------------+-------------+-------+------------+-----------+------------+------------+
| 1 | com.wsk.bigdata.udf.HelloUDF | 1555263915 | 6 | sayhello_2 | 1 | NULL | USER |
+---------+------------------------------+-------------+-------+------------+-----------+------------+------------+
3.3编译hive支持自定义的UDF函数
请参考??