在前文中我们实践了基于hadoop的数据仓库Hive的安装、配置、应用、扩展等,那么我们在实际中该如何通过程序调用(用户接口)开发呢,Hive提供了三种调用方式:首先是CLI就是我们前面使用过的Hive Shell命令行、然后就是通过JDBC或者ODBC的调用(通过程序可实现调用),最后就是官方提供的WebUI的方式。本文我们详细说的是使用JDBC通过Java代码去访问Hive服务,进行一些基本的操作。

一、环境准备

1.Hadoop集群

2.Hive元数据存储服务(mysql服务)

3.Hive数据仓库服务

4.Eclipse开发工具

二、开发准备

1.创建一个空的java项目

2.创建如上的包
util包中使我们操作的jdbc或者odbc的工具类
main包中使我们程序运行的主类所在

3.启动Hadoop集群
在主节点上启动Hadoop集群start-all.sh

4.启动元数据库服务
登陆元数据库服务所在主机,启动Mysql服务service mysql start

5.启动Hiveserver2服务
在Hive机器上启动Hiveserver服务:hive –service hiveserver2 或者hive –service hiveserver2 &

6.启动Hive Metastore服务
在Hive机器上启动Hive Metastore服务:hive –service metastore或者hive –service metastore &

看到如下信息,说明启动完成:

7.验证启动
在终端输入jps -ml查看:

可以看到Hadoop集群个Hive服务启动都正常

三、开始编码

1.编写jdbc工具类
编写打开Hive连接的方法

代码块:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 private static String driver = "org.apache.hive.jdbc.HiveDriver";
private static String url = "jdbc:hive2://hdpc01:10000/default";
private static String user = "root";
private static String pass = "123456";

// 打开连接
public static Connection openConnection() {
Connection conn = null;
try {
Class.forName(driver);
conn = DriverManager.getConnection(url, user, pass);
} catch (Exception e) {
e.printStackTrace();
}
return conn;
}

编写关闭Hive连接的方法

代码块:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// 关闭连接
public static void closeConnection(Statement stmt, Connection conn) {
try {
if (stmt != null) {
stmt.close();
stmt = null;
}
if (conn != null) {
conn.close();
conn = null;
}
System.out.println(">>>>>>>>>>>>>>>>>>>>:关闭连接成功...");
} catch (Exception e) {
e.printStackTrace();
}
}

测试连接

代码块:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
package com.maxbill.hive.main;

import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;

import com.maxbill.hive.util.JdbcUtils;

/**
* @user maxbill
* @date 2018/01/16
* @func hive操作测试类
*/
public class HiveTest {

public static void main(String[] args) {
// 1.测试连接
testHiveConn();
}

public static void testHiveConn() {
try {
Connection conn = JdbcUtils.openConnection();
Statement stmt = conn.createStatement();
if (null != stmt) {
System.out.println(">>>>>>>>>>>>>>>>>>>>:打开连接成功...");
// 此处主要是测试连接是否正常,打开成功后,我们调用关闭方法释放连接
JdbcUtils.closeConnection(stmt, conn);
} else {
System.out.println(">>>>>>>>>>>>>>>>>>>>:打开连接失败...");
}
} catch (SQLException e) {
e.printStackTrace();
}
}

}

执行测试连接的Hive方法

发生异常,这是因为缺少hive驱动包,我们在项目中导入以下jar包即

然后继续测试,连接成功

2.基本查询操作

代码块:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
 public static void main(String[] args) {
String sql = "select * from tb_user";
runQuerySql(sql);
}

// 查询数据
public static void runQuerySql(String sql) {
try {
Connection conn = JdbcUtils.openConnection();
Statement stmt = conn.createStatement();
if (null != stmt) {
System.out.println(">>>>>>>>>>>>>>>>>>>>:打开连接成功...");
ResultSet rs = stmt.executeQuery(sql);
System.out.println(">>>>>>>>>>>>>>>>>>>>:执行运行结果...");
// 输出查询的结果集
List list = resultSetToList(rs);
for (Object listObj : list) {
System.err.println(listObj.toString());
}
// 调用关闭方法释放连接
JdbcUtils.closeConnection(stmt, conn);
} else {
System.out.println(">>>>>>>>>>>>>>>>>>>>:打开连接失败...");
}
} catch (SQLException e) {
e.printStackTrace();
}
}

// ResultSet结果集转成list
public static List resultSetToList(ResultSet rs) throws java.sql.SQLException {
if (rs == null)
return Collections.EMPTY_LIST;
ResultSetMetaData md = rs.getMetaData(); // 得到结果集结构信息,比如字段数、字段名等
int columnCount = md.getColumnCount(); // ResultSet的列数
List list = new ArrayList();
Map rowData = new HashMap();
while (rs.next()) {
rowData = new HashMap(columnCount);
for (int i = 1; i <= columnCount; i++) {
rowData.put(md.getColumnName(i), rs.getObject(i));
}
list.add(rowData);
}
return list;
}

下面的查询操作都是基于以上方法,只需传入sql语句参数,使用DML的查询方法
1>.基本查询
sql=”SELECT * FROM tb_user WHERE id>0”;

2>.查看表结构
sql=”desc tb_user”;

3>.统计查询
sql=”SELECT COUNT(id) FROM tb_user “;

4>.表查询
sql=”show tables “;

以下的创建删除表等操作没有rs结果,使用DLL语句的处理方法

代码块:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 // 数据操作
public static void runHandleSql(String sql) {
try {
Connection conn = JdbcUtils.openConnection();
Statement stmt = conn.createStatement();
if (null != stmt) {
System.out.println(">>>>>>>>>>>>>>>>>>>>:打开连接成功...");
stmt.execute(sql);
// 调用关闭方法释放连接
JdbcUtils.closeConnection(stmt, conn);
} else {
System.out.println(">>>>>>>>>>>>>>>>>>>>:打开连接失败...");
}
} catch (SQLException e) {
e.printStackTrace();
}
}

5>.创建表
sql = “create table tb_test (key int, value string) row format delimited fields terminated by ‘\t’”;
然后执行show tables 可以看到创建的tb_test表

6>.删除表
sql=”drop table if exists tb_test”;
然后执行show tables 可以看到创建的tb_test表已经删除

四、文末总结

以上就是本文使用Java代码通过Jdbc的方式连接Hive进行的简单的一些DLL查询和DML查询操作,在实际开发中相比之前的Hive Shell方式,使用代码去操作的方式用的更多点。本文的测试代码已经上传码云,代码地址为:https://gitee.com/MaxBill/HSDP