1. 开启hive的远程连接
// 即使关闭当前会话但进程不会结束
nohup hive --service hiveserver2 --hiveconf hive.server2.thrift.port=10010 &
2. 导入jar包
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 getTaleList() {
List 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 getTableInfo(String tableName){
List 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 getTableData(String tableName){
List 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 getResultData(String sql) {
List 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;
}
}