UDF是用来对HIVE函数库进行扩展的,可以利用java代码进行自定义的功能需求。
1.新建java工程。
2.导入HIVE相关包,jar包在HIVE安装程序的lib目录下,只需要拷贝jar包即可。
3.创建类继承UDF类。
4.自己编写一个名为evaluate方法,返回值和参数任意,但是方法名字必须是evluate。
为了能让mapreduce处理,String要用Text处理。
5.将写好的类打成jar包,在打jar包的时候可以只打自己写的类,jar包资源可以不打进jar包里。然后上传到linux中。
5.在hive命令行下,向hive注册UDF:add jar /xxxx/xxxx.jar
6.为当前UDF起一个名字:create temporary function fname as '类的全路径名';
之后就可以在hql中使用该自定义函数了。
编写一个简单的小写转大写。
import org.apache.hadoop.hive.ql.exec.UDF;
public class MyUDFDemo extends UDF{
public String evluate(String str) {
return str.toUpperCase();
}
}
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;
PreparedStatement 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的驱动以及连接地址协议。