由于Hive内置的函数不能满足业务需求,我们可以利用Java编写
自定义函数步骤
1. 创建一个 Maven 工程,导入 hive-exec jar 依赖 org.apache.hive hive-exec 1.2.1
2. 创建自定义函数类
自定义 UDF 函数,创建的类需继承 GenericUDF类,重写方法(org.apache.hadoop.hive.ql.udf.generic.GenericUDF)
3. 在 hive 的命令行窗口创建函数
创建函数分为:创建临时函数 和 创建永久函数 两种。
创建函数命令如下:
create [temporary] function [dbname.]function_name AS class_name;
删除函数命令如下:
drop [temporary] function [if exists] [dbname.]function_name;
1)创建临时函数
1.将 maven 工程打包后的 jar,添加到 linux 服务器某个目录下
2.使用命令添加 jar,命令为:add jar 目录(jar所在linux目录)
3.创建function,命令:create temporary function 函数名 as 类路径(jar包中自定义函数的类路径)
4.通过命令:show functions可查看自己创建的函数。
5.提示:临时函数,在hive客户端关闭后失效,对 hive 中的全部数据库有效
2)创建永久函数
1.将 maven 工程打包后的 jar,上传到 hdfs 某个目录下(目录可自定义)
2.创建function,命令:create function ‘库名.函数名’ as ‘类路径’ using jar ‘jar包所在hdfs目录’
3.通过命令:show functions可查看自己创建的函数 (如果函数名不是【库名.函数名】格式,show functions是看不到的)。
4.提示:永久函数,只对当前所在库生效,其他库均不生效,所以建议使用【库名.函数名】命名方式。函数不会因为客户端的关闭而失效。
5.在 test 库下创建函数,名称为 test.split,在test 库下可直接 split() 方式使用。如需在 default 库下使用,则可通过加 test 前缀使用。
————————————————
一、临时函数
临时函数定义: create temporary function 函数名 as '包名.类';
背景:给定一个经纬度,圈出以此坐标为圆心一定距离内的基站编码
1、步骤:
(1)必须导入两个jar包:hadoop-core-1.0.4.jar 和 hive-exec-0.13.1.jar;
(2)创建类必须继承UDF类;
(3)类必须重写evaluate方法;方法可以重载,根据自己的需求编写自己的方法。
(4)写好之后测试无误,打包成jar包,命名liujh _distance.jar。
2、将打包好的JAR包导入主机目录下
例如添加到 /data1/aaaa/test/shell 路径下
(1)在hive中添加包;
hive> add jar /data1/aaaa/test/shell /liujh_distance.jar;
Added /data1/aaaa/test/shell /liujh_distance.jar to class path
(2)在hive中创建函数
hive> create temporary function liujh_distanceas as 'udffunc.LiujhUdfFunc';
OK
Time taken: 0.407 seconds
Liujh_distance是自己的函数名称,这个是自己定义的
udffunc.LiujhUdfFunc是函数在jar包中的路径 包名.类名 的方式
(3)查看函数
show functions like ‘%liujh_distance%’
(4)使用函数
hive> select liujh_distance(120.0001,30.001,120.110,30.110)from dual;
150.87
(5)删除函数
hive> Drop temporary function liujh_distance;
二、永久函数
定义:create function 函数名 as '包名.类名' using jar 'hdfs://ip:port/home/hive/jars/udf/xxx.jar';
1、编写函数的方法,下面方法是由java编写的
继承UDF类,然后去重写evaluate方法,
2、方法写完后进行验证是否符合自己的预期效果,如果符合把这个类打包为jar包,上传到服务器,然后通过hadoop fs -put 的方式上传到集群,
3、上传之后通过hadoop fs -chmod 777 去修改文件的权限,修改权限主要是为了让所有的用户都能使用这个永久函数,这个根据自己情况去修改。
例如:A用户去创建自定义函数(永久),文件上传到集群时,权限为700,那么这个永久函数只能是A用户去使用,同组下的B用户是不能调用这个函数的,会报如下错误,(invalid function 函数名)
4、修改完权限后,进入hive,执行命令(确保当前用户有admin权限)
set role admin;切换admin权限
show current roles;查看当前用户权限
create function ① as '②' using jar '③';
①是代表方法名,②代表包名.类名,如cn.com.test,③代表jar包存放HDFS的路径.
create function add_prefix
as 'com.test.AddPrefix'
using jar 'hdfs:///wh/test/addPrefix.jar'
通过select add_prefix("参数");进行验证。(注意:如果role没设置正确,则该永久函数只能在创建永久函数的数据库下可用)
小总结:
参考:
1)hive------------创建自定义函数(function)_hive create function_leson-xu的博客-CSDN博客