自定义函数
编写代码
1.创建一个普通Java工程
2.导入hive安装目录下lib中所有以hive打头的jar包
3.写代码实现一个ToUpper类
package com.jv.hive;
import org.apache.hadoop.hive.ql.exec.UDF;
public class MyToUpper extends UDF{
public String evaluate(String src) {
return src.toUpperCase();
}
}
4.导入jar包
5.上传jar包到hive安装目录下的lib中
注册函数
1.添加jar
hive> add jar /home/hadoop/proc/apache-hive-1.2.2/lib/mytoupper.jar;
输出:
2.注册类
create temporary function mytoupper as 'com.jv.hive.MyToUpper';
输出:
3.测试
select mytoupper(ename) from emp limit 10;
输出:
重要:上面注册的UDF函数是临时的,如果退出hive客户端,再进去就无法使用mytoupper函数
Hive提供了永久注册函数的方式:
create function park.mytoupper as 'com.jv.hive.MyToUpper' using jar 'hdfs://192.168.245.150:9000/user/hive/warehouse/udf/mytoupper.jar'
park是数据库名
jar包需要放到hdfs中
所有客户端连接上来都可以使用mytoupper函数
其他数据库要使用该函数可以加park.mytoupper
建议不要弄太复杂的函数,如果效率低下会严重影响hive的性能,甚至把机器搞挂
jdbc访问Hive
1.在服务器上启动hive service
./hive --service hiveserver2 &
2.在上面的工程中加入hadoop-common-2.7.1.jar包
3.编写代码
package com.jv.hive;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
public class TestHiveJdbc {
public static void main(String[] args) throws Exception {
Class.forName("org.apache.hive.jdbc.HiveDriver");
Connection conn = DriverManager.getConnection("jdbc:hive2://192.168.245.150:10000/park","root","root");
Statement stat = conn.createStatement();
/*
* 1.如果注册UDF函数是临时的,想要在代码中使用UDF还需重新注册
String sql = "add jar /home/hadoop/proc/apache-hive-1.2.2/lib/mytoupper.jar";
stat.execute(sql);
sql = "create temporary function mytoupper as 'com.jv.hive.MyToUpper'";
stat.execute(sql);
* 2.如果注册UDF函数是永久的,则可以直接使用UDF函数
*/
ResultSet rs = null;
rs = stat.executeQuery("select mytoupper(ename) ename from emp limit 10");
while(rs.next()) {
System.out.println(rs.getString("ename"));
}
stat.close();
conn.close();
}
}
只是为了演示,所以异常处理都是直接throws