UDF是用来对HIVE函数库进行扩展的,能够利用java代码进行自定义的功能需求。java
1.新建java工程。linux
2.导入HIVE相关包,jar包在HIVE安装程序的lib目录下,只须要拷贝jar包便可。sql
3.建立类继承UDF类。org.apache.hadoop.hive.ql.exec.UDFshell
4.本身编写一个名为evaluate方法,返回值和参数任意,可是方法名字必须是evaluate。数据库
5.将写好的类打成jar包,在打jar包的时候能够只打本身写的类,jar包资源能够不打进jar包里。而后上传到linux中。apache
6.在hive命令行下,向hive注册UDF,并建立当前函数(如何注册和建立在下面介绍)。编程
完成以上步骤以后就能够在hql中使用该自定义函数了。bash
编写一个简单的小写转大写。服务器
import org.apache.hadoop.hive.ql.exec.UDF; public class MyUDFDemo extends UDF{ public String evaluate(String str) { return str.toUpperCase(); } }
在向Hive注册函数的时候,分为临时注册和永久注册。函数
注册临时函数比较简单,只要在hive的shell界面输入如下两条命令,便可注册,可是此函数会在你退出当前Hive的shell时,自动去掉。
#注册临时函数 hive> add jar /xxx/xxx/xxx.jar; #命名临时函数 hive> create temporary function function_name as "xx.xx.xx.classname";
以上两部就能够生成一个自定义的函数了。切记,这个是临时的,适合测试使用,不适合生产环境。
[root@xh01 horseman]# ls HorseMan.jar [root@xh01 horseman]# pwd /home/script/horseman
以上是本人的jar包以及存放位置,jar包中有一个类,类的全路径名为:cn.com.xh.udf.OnWork.class。
如下是登陆Hive的shell进行临时添加的操做:
[root@xh01 horseman]# hive #省略系统输出 #………… hive> add jar /home/script/horseman/HorseMan.jar; Added [/home/script/horseman/HorseMan.jar] to class path Added resources: [/home/script/horseman/HorseMan.jar] hive> create temporary function on_work as "cn.com.xh.udf.OnWork"; OK Time taken: 0.007 seconds hive> select on_work();
如上,成功添加了一个名为on_work的方法。
注册永久函数,统计网上的说法,有两种,其一修改源码,其二就是本人接下来要说的一种。
第一种比较危险,由于一个弄很差,就会形成Hive崩盘,并且不适合生产环境,咱们添加函数,都是在业务发展的过程当中添加的,不会说从新去搭建一个Hive来专门弄一个函数。
第二种添加的方法和临时的区别不大,可是适合咱们在生产环境使用。
如下是官方给出的说明:
在Hive 0.13或更高版本中,函数能够注册到Metastore,所以能够在查询中引用它们,而无需在每一个会话中建立临时函数。
建立功能
hive> CREATE FUNCTION [db_name.]function_name AS class_name [USING JAR|FILE|ARCHIVE 'file_uri' [, JAR|FILE|ARCHIVE 'file_uri'] ];
此语句容许您建立由class_name实现的函数。可使用USING子句指定须要添加到环境中的jar,文件或存档;当Hive会话第一次引用该函数时,这些资源将被添加到环境中,就像发布了ADD JAR / FILE同样。若是Hive不在本地模式,则资源位置必须是非本地URI,例如HDFS位置。
该函数将添加到指定的数据库,或者在建立函数时添加到当前数据库。能够经过彻底限定函数名称(db_name.function_name)来引用该函数,或者若是函数位于当前数据库中,则能够无限制地引用该函数。
删除功能
hive>DROP FUNCTION [IF EXISTS] function_name;
若是函数不存在,DROP将返回错误,除非指定了IF EXISTS或配置变量hive.exec.drop.ignorenonexistent 设置为true。
注意:删除函数时,必定要处于添加函数的数据库中。
从新加载功能
hive> RELOAD FUNCTION;
从HIVE-2573开始,若是在建立函数以前启动了HiveServer2或其余Hive CLI会话,则在一个Hive CLI会话中建立永久功能可能不会反映出来。在HiveServer2或HiveCLI会话中发出RELOAD FUNCTION将容许它获取可能由不一样HiveCLI会话完成的永久功能的任何更改。
查看官方原文请点击此处
本人将临时方法注册的jar包拿过来,存放到HDFS中的/udf/horseman/目录中,添加方法以下:
hive>create function on_work as 'cn.com.xh.udf.OnWork' using jar 'hdfs://xh01:9000/udf/horseman/HorseMan.jar';
这个只须要这一条语句,便可建立永久的函数。以下是删除函数:
hive>drop function on_work;
hive实现了jdbc接口,因此能够很是方便用jdbc技术经过java代码操做。
HIVE默认状况是关闭对外的服务,须要在服务器端开启HiveServer2服务,命令以下:
./hive --service hiveserver2
这个模式一直开启的状况下,才能链接成功,不然,链接失败。
可使用一下命令,是该服务进入后台运行:
[root@hadoop bin]# ./hive --service hiveserver2 & [1] 6669 [root@hadoop bin]# bg 1 -bash: bg: job 1 already in background
这样程序进入后台运行,也不影响进行其余操做。
建立本地java工程。
导入hive\lib目录下的hive-jdbc-1.2.0-standalone.jar
导入hadoop-2.7.1\share\hadoop\common下的hadoop-common-2.7.1.jar
public static void main(String[] args) { Connection conn = null; Statement st = null; ResultSet rs = null; try { // 1.注册数据库驱动 Class.forName("org.apache.hive.jdbc.HiveDriver"); // 2.获取数据链接 conn = DriverManager.getConnection("jdbc:hive2://192.168.75.150:10000/park", "root", "root"); // 3.获取传输器对象 st = conn.createStatement(); // 4.传输sql执行获取结果集 rs = st.executeQuery("select * from stu"); // 5.处理结果集 while (rs.next()) { String str = rs.getString("name"); System.out.println(str); } } catch (Exception e) { e.printStackTrace(); } finally { // 6.关闭链接 if (rs != null) { try { rs.close(); } catch (Exception e) { e.printStackTrace(); } finally { rs = null; } } if (st != null) { try { st.close(); } catch (Exception e) { e.printStackTrace(); } finally { st = null; } } if (conn != null) { try { conn.close(); } catch (Exception e) { e.printStackTrace(); } finally { conn = null; } } } }
以上须要注意的是jdbc的驱动以及链接地址协议。
上一篇:HIVE内置函数
下一篇:Hive应用:外部表连接内部表