相关说明
- 使用java代码访问hive的时候需要hive的守护进程——hiveserver2
- 也可以使用另外一个命令行客户端beeline进行对hive的访问
守护进程模式启动和beeline简单使用
hiveserver2 &
# 启动,并挂到后台
netstat -tupln|grep 10000
# 默认的端口是10000
beeline
!connect jdbc:hive2://localhost:10000 abc
# 交互式连接到hiveserver2
# 默认端口是10000
# 指定连接的OS用户是abc
# 需要输入密码
# 经测试,使用一个不存在的用户和密码也是可以登录的
# 应该是个BUG
show databases;
use test1;
show tables;
select * from emp;
# Ctrl+d 退出
beeline -u jdbc:hive2://localhost:10000/test1
# 直接连接到对应的库
select * from emp;
# Ctrl+d 退出
使用JDBC访问HiveServer2
参照《Win7 IDEA 开发环境搭建部署》和《hive UDF 测试样例开发》配置idea开发环境和pom配置文件。
pom.xml添加mysql的驱动依赖:
<!-- 添加hive的jdbc驱动包 -->
<dependency>
<groupId>org.apache.hive</groupId>
<artifactId>hive-jdbc</artifactId>
<version>${hive.version}</version>
</dependency>
根据官方样例代码改造测试,官方样例代码地址如下:
https://cwiki.apache.org/confluence/display/Hive/HiveClient#HiveClient-JDBC
创建jdbc包,创建JdbcConnectHive类,测试代码如下:
package com.vincent.jdbc;
/*
通过JDBC的方式访问hive(HiveServer2)
*/
import java.sql.*;
public class JdbcConnectHive {
private static String driverName = "org.apache.hive.jdbc.HiveDriver";
// 官网驱动包名字:org.apache.hadoop.hive.jdbc.HiveDriver 有问题,改掉
public static void main(String[] args) throws SQLException {
try {
Class.forName(driverName);
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.exit(1);
}
// 没有驱动就退出
Connection con = DriverManager.getConnection("jdbc:hive2://192.168.1.10:10000/default", "hadoop", "hadoop");
// 设置连接串对象,连接到的HiveServer2地址
// 官网链接串写的jdbc:hive://... 应该是jdbc:hive2//...
Statement stmt = con.createStatement();
// 根据连接串对象,创建会话
String sql = "show databases";
System.out.println("Running: " + sql);
ResultSet res = stmt.executeQuery(sql);
if (res.next()) {
while (res.next()) {
System.out.println(res.getString(1));
}
}
// 拼sql执行字符串:show databases;
// 使用executeQuery()函数执行DML查询
// 将查询结果赋值给ResultSet类型的res对象
// 判断该对象是否为空,并打印不为空时候的结果
// default库默认不显示
sql = "use default";
System.out.println("\nRunning: " + sql);
stmt.execute(sql);
sql = "show tables";
System.out.println("Running: " + sql);
res = stmt.executeQuery(sql);
if (res.next()) {
while (res.next()) {
System.out.println(res.getString(1));
}
}
// 执行DDL等没有数据返回的SQL语句时使用函数execute()
// 执行有数据返回的SQL语句时使用executeQuery(),并将返回结果赋值给ResultSet类型的一个对象
}
}
执行结果如下:
来自@若泽大数据