HIVEjdbc搭建

1. 开启hive的远程连接

// 即使关闭当前会话但进程不会结束
nohup hive --service hiveserver2 --hiveconf hive.server2.thrift.port=10010 &

2. 导入jar包

链接:https://pan.baidu.com/s/1iS36dT7ilWS5qbSiV7raHw 密码:u6fd 添加到java项目中

3. 代码详解

  • code
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

public class HiveUtil {
	
	private Statement statement = null;
	
	// HiveUtil实例化时会自动打开连接并导入自定义方法udf
	public HiveUtil() {
		open();
		Init();
	}
	
	// 初始化udf自定义方法包(当连接断开时,方法会自动失效),若有新的方法可在后面新增执行语句
	private void Init() {
		try {
			statement.execute("add jar /home/bigdata/udf.jar");
			statement.execute("create temporary function sub as 'com.yulang.udf.SubString'");
			statement.execute("create temporary function jsonParse as 'com.yulang.udf.JsonParse'");
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}

	static {
		try {
			// 1.加载驱动
			Class.forName("org.apache.hive.jdbc.HiveDriver");
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	private void open() {
		try {
			// 2.打开连接
			Connection connection = DriverManager.getConnection("jdbc:hive2://HADOOP01:10010/");
			// 3.获得操作对象 - 会话
			statement = connection.createStatement();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	/**
	 * 创建数据库 - 用户注册时调用
	 * @param databaseName 根据用户标识生成的数据库名称
	 */
	public void createDatabase(String databaseName) {
		try {
			statement.execute("create database " + databaseName);
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	/**
	 * 切换数据库 - 只对当前会话有效
	 * @param databaseName 目标数据库名称
	 */
	public void changeDatabase(String databaseName) {
		try {
			statement.execute("use " + databaseName);
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	/**
	 * 获得当前数据库中的数据列表 - 注意切换数据库
	 * @return 数据表名称的集合
	 */
	public List<String> getTaleList() {
		List<String> list = new ArrayList<>();
		try {
			ResultSet rs = statement.executeQuery("show tables");
			while (rs.next()) {
				list.add(rs.getString(1));
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return list;
	}
	
	/**
	 * 获得数据表的简要信息
	 * @param tableName 数据表名称
	 * @return 列名及列的数据类型
	 */
	public List<String> getTableInfo(String tableName){
		List<String> list = new ArrayList<>();
		try {
			ResultSet rs = statement.executeQuery("desc " + tableName);
			while (rs.next()) {
				list.add(rs.getString(1) + "\t" + rs.getString(2));
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return list;
	}
	
	/**
	 * 获取数据表前十条的预览数据
	 * @param tableName 数据表名称
	 * @return 数据表预览数据
	 */
	public List<String> getTableData(String tableName){
		List<String> list = new ArrayList<>();
		try {
			int size = getTableInfo(tableName).size();
			ResultSet rs = statement.executeQuery("select * from " + tableName +" limit 10");
			while (rs.next()) {
				String line = "";
				for(int i = 1;i <= size;i ++) {
					line += rs.getString(i) + "\t";
				}
				list.add(line);
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return list;
	}
	
	/**
	 * 获得查询sql执行后的返回结果
	 * @param sql 用户自定义sql
	 * @return sql执行结果集中的所有数据
	 */
    public List<String> getResultData(String sql) {
    		List<String> list = new ArrayList<>();
    		try {
    			String tableName = "tmp_table";
    			sql = "create table " + tableName + " as " + sql;
    			// 执行建表语句
    			statement.execute(sql);
    			// 通过查询方法获取到新建表的数据
    			list = getTableData("tmp_table");
    			// 使用完临时表后drop临时表
    			statement.execute("drop table "+ tableName);
    		} catch (SQLException e) {
    			e.printStackTrace();
    			list = null;
    		}
    		return list;
    	}

}

转载于:https://my.oschina.net/yulang/blog/2050387

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值