Hive自定义函数与JDBC连接

自定义函数

编写代码

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

猜你喜欢

转载自my.oschina.net/u/3049601/blog/1816865
今日推荐