Hive—UDF函数编写
一、UDF函数
UDF(User-Defined Functions)即用户定义的hive函数。hive自带的函数并不能完全满足业务需求,这时就需要我们自定义函数。
二、分类
- UDF:one to one,进来一个出去一个,row mapping。是row级别操作,如:upper、substr函数
- UDAF:many to one,进来多个出去一个,row mapping。是row级别操作,如sum/min。
- UDTF:one to many ,进来一个出去多个。如alteral view与explode
三、编写方法
1)程序编写方法:
(1)继承org.apache.hadoop.hive.ql.UDF
(2)需要实现evaluate函数;evaluate函数支持重载;
(3)在hive的命令行窗口创建函数
注:UDF必须要有返回类型,可以返回null,但是返回类型不能为void;
2)Hive加载jar文件
(1)添加jar
add jar linux_jar_path
(2)创建function
create [temporary] function [dbname.]function_name AS class_name;
(3)在hive的命令行窗口删除函数
Drop [temporary] function [if exists] [dbname.]function_name;
三、实例
1.eclipse建maven项目
2.导入依赖
<dependencies> <dependency> <groupId>org.apache.hive</groupId> <artifactId>hive-exec</artifactId> <version>1.2.2</version> </dependency> </dependencies>
3.编写一个测试函数
package com.atguigu.hive; import org.apache.hadoop.hive.ql.exec.UDF; public class Lower extends UDF { public String evaluate(final String s) { if (s == null) { return null; } return s.toLowerCase(); } }
4.export导出jar文件
5.将udf.jar上传至/opt/module/jars/目录。
6.将jar包添加到hive的classpath
hive (default)> add jar /opt/module/jars/udf.jar; Added [/opt/module/jars/udf.jar] to class path Added resources: [/opt/module/jars/udf.jar]
7.创建临时函数
hive (default)> create temporary function mylower as "com.atguigu.hive.Lower"; OK Time taken: 1.06 seconds
temporary函数当前黑窗口有效,重新打开无效,提示以下错误。
hive (default)> select mylower(ename) from emp; FAILED: SemanticException [Error 10011]: Line 1:7 Invalid function 'mylower'
8.执行临时函数
hive (default)> select ename,mylower(ename) from emp; OK ename _c1 SMITH smith ALLEN allen WARD ward JONES jones MARTIN martin BLAKE blake CLARK clark SCOTT scott KING king TURNER turner ADAMS adams JAMES james SMITH smith ALLEN allen WARD ward JONES jones MARTIN martin BLAKE blake CLARK clark SCOTT scott KING king TURNER turner ADAMS adams JAMES james Time taken: 1.07 seconds, Fetched: 24 row(s)
9.创建永久函数
(1)HDFS上创建路径
[ck@hadoop102 ~]$ dfs -mkdir -p /lib
(2)上传jar包到/lib路径
hive (default)> dfs -put /opt/module/jars/udf.jar /lib
(3)创建函数
hive (default)> create function mylower1 as 'com.atguigu.hive.Lower' using jar 'hdfs://hadoop102:9000/lib/udf.jar';
(4)在MySQL的metastore库中执行
select * from FUNCS;
参考atguigu视频资料