文档章节

HIVE的UDF以及JDBC编程

星汉
 星汉
发布于 2018/04/29 12:15
字数 1606
阅读 1.6K
收藏 1

HIVE的UDF以及JDBC编程

一、UDF

    UDF是用来对HIVE函数库进行扩展的,可以利用java代码进行自定义的功能需求。

1、步骤

    1.新建java工程。

    2.导入HIVE相关包,jar包在HIVE安装程序的lib目录下,只需要拷贝jar包即可。

    3.创建类继承UDF类。org.apache.hadoop.hive.ql.exec.UDF

    4.自己编写一个名为evaluate方法,返回值和参数任意,但是方法名字必须是evaluate

    5.将写好的类打成jar包,在打jar包的时候可以只打自己写的类,jar包资源可以不打进jar包里。然后上传到linux中。

    6.在hive命令行下,向hive注册UDF,并创建当前函数(如何注册和创建在下面介绍)。

    完成以上步骤之后就可以在hql中使用该自定义函数了。

案例

    编写一个简单的小写转大写。

import org.apache.hadoop.hive.ql.exec.UDF;
public class MyUDFDemo extends UDF{
	public String evaluate(String str) {
		return str.toUpperCase();
	}
}

2、注册函数

在向Hive注册函数的时候,分为临时注册和永久注册。

1.临时注册

注册临时函数比较简单,只要在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的方法。

2.永久注册

注册永久函数,统计网上的说法,有两种,其一修改源码,其二就是本人接下来要说的一种。

第一种比较危险,因为一个弄不好,就会造成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;

二、JDBC编程

1、介绍

    hive实现了jdbc接口,所以可以非常方便用jdbc技术通过java代码操作。

2、步骤

1.开启对外服务

    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

    这样程序进入后台运行,也不影响进行其他操作。

2.java工程

1>创建工程

    创建本地java工程。

2>导入jar包

    导入hive\lib目录下的hive-jdbc-1.2.0-standalone.jar

    导入hadoop-2.7.1\share\hadoop\common下的hadoop-common-2.7.1.jar

3>编写jdbc代码

	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应用:外部表链接内部表

© 著作权归作者所有

上一篇: HBase简介及搭建
下一篇: HIVE内置函数
星汉

星汉

粉丝 50
博文 106
码字总数 302232
作品 0
朝阳
高级程序员
私信 提问
加载中

评论(0)

[Hive]Hive自定义函数UDF

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/SunnyYoona/article/details/53244868 当Hive提供的内置函数无法满足你的业务处理需要时,此时就可以考虑使用...

sjf0115
2016/11/20
0
0
Hive 随谈(六)– Hive 的扩展特性

Hive 是一个很开放的系统,很多内容都支持用户定制,包括: 文件格式:Text File,Sequence File 内存中的数据格式: Java Integer/String, Hadoop IntWritable/Text 用户提供的 map/reduce...

红薯
2010/04/21
3.1K
1
Hive问题之UDF语义错误10014

Hive问题之UDF语义错误10014 问题描述 使用Hive处理数据的时候,写了一个UDF,然后上传到服务器,添加到Hive中之后,一直报如下的错误: 解决思路 语义错误,错误码10014,我只在网上看到一个...

星汉
2018/08/30
726
0
Java AES256加密解密实现(Hive udf函数)

AES加密解密类: UDF函数(AES256 加密解密): 异常: java.security.InvalidKeyException: Illegal key size 今天在做接口测试的时候遇到个异常: java.security.InvalidKeyException: Ill...

夜空07
昨天
0
0
hive利器 自定义UDF+重编译hive

用hive也有一段时间里,不过一直没写过相关到日志,因为主要用hive也无非是create table,upload data,CRUD 这几个过程。后来工作中需要用到一些常用到方法,了解到hive中支持UDF(User Defi...

王二铁
2012/06/28
4.2K
3

没有更多内容

加载失败,请刷新页面

加载更多

C/C++ 第五周线性表 项目(一)建立顺序栈的算法库

/* *Copyright(c)2017,烟台大学计算机学院 *All right reserved. *文件名:main.cpp sqstack.h sqstack.cpp *作者:黄士胜 *完成日期:2017年9月28日 *版本号:v1.0 * *问题...

osc_r94nrknb
7分钟前
4
0
怎样用cmd启动停止服务

在cmd下可有两种方法打开,net和sc,net用于打开没有被禁用的服务,语法是: net start 服务名 net stop 服务名 用sc可打开被禁用的服务,语法是: sc config 服务名 start= demand //手动 ...

osc_5zaxkz1e
9分钟前
9
0
kubernetes使用harbor私有仓库

预置 harbor url: https://harbor.test.com:6443 image url: harbor.test.com:6443/test/test-secret:latest namespace: harbor-test 将harbor的ca.crt复制到node的/etc/docker/certs.d/har......

钾肥尔德
9分钟前
10
0
Mac忘记登录密码的解决方法

忘记mac登录密码这个问题如何解决呢?这得看你的Mac有没有开启FileVault,这里先简单介绍一下FileVault。FileVault是苹果系统的一项保密措施,一般刚买的Mac开机时会让你设置是否开启FileVau...

麦克虾仔
9分钟前
10
0
20行实现一个Promise

作者:晨曦时梦见兮 来源: 掘金 前言 在面试的时候,经常会有面试官让你实现一个Promise,如果参照A+规范来实现的话,可能面到天黑都结束不了。 说到Promise,我们首先想到的最核心的功能就是...

JamesView
10分钟前
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部