文章目录
- 1. 前言
- 2. 通过java访问Hive
- 2.1 启动HiveServer2
- 2.2 Java API操作Hive的例子
- 2.2.1 创建Maven项目
- 2.2.2 实例代码
- 2.2.3 效果截图
- 3. 再来举个栗子
1. 前言
在前面几篇中已经实现了Hive的配置和安装,并且基于Hive Shell实现了数据的基础分析,平常我们通过Hive做简单的数据分析实验的时候,都是直接进入Hive执行HiveQL,通过进入Hive执行HiveQL,只能将分析结果打印到屏幕或是存入临时表,如果想把分析结果写入文件,或者对分析结果做进一步的分析,就需要用程序做分析,那么接下来看一下如何通过Java访问Hive数据仓库。
2. 通过java访问Hive
2.1 启动HiveServer2
前面几篇文章介绍的都是使用Hive Shell访问Hive,如果想通过Java访问Hive则需要通过HiveServer2的方式,**HiveServer2可以使Hive以服务器形式运行,这样便于不同的客户端连接到Hive,并进行相关的操作。**并且可以通过hive.server2.thrift.port配置属性来指定服务器所监听的端口号,默认为10000。
HiverServer2的启动命令如下:
hive --service hiveserver2 &
以上就是以hiveserver2的方式启动hive,并在后台运行,启动成功后,就可以通过Java连接到Hive了。
2.2 Java API操作Hive的例子
2.2.1 创建Maven项目
Maven的pom.xml文件配置如下:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>hadoop</groupId>
<artifactId>hive</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
<version>2.6.5</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-hdfs</artifactId>
<version>2.6.5</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-common</artifactId>
<version>2.6.5</version>
</dependency>
<dependency>
<groupId>org.apache.hive</groupId>
<artifactId>hive-jdbc</artifactId>
<version>1.2.2</version>
</dependency>
</dependencies>
</project>
2.2.2 实例代码
import java.sql.*;
public class HiveTest {
private static final String DRIVER = "org.apache.hive.jdbc.HiveDriver";
private static final String DATABASE_PATH = "jdbc:hive2://master001:10000/lhd";
private static final String USER_NAME = "hadoop";
private static final String PASSWORD = "";
private static Connection connection = null;
private static Statement statement = null;
private static ResultSet resultSet = null;
private static final String HQL = "select count(*) from person";
public static void main(String[] args) throws SQLException {
int count = 0;
try{
// 1.加载驱动
Class.forName(DRIVER);
System.out.println("1");
// 2.创建链接
connection = DriverManager.getConnection(DATABASE_PATH, USER_NAME, PASSWORD);
System.out.println("2");
// 3.创建statement对象
statement = connection.createStatement();
System.out.println("3");
// 4.执行HQL语句
resultSet = statement.executeQuery(HQL);
System.out.println("4");
// 5.处理结果集
if(resultSet.next()){
count = resultSet.getInt(1);
System.out.println("5");
}
}catch (Exception e){
e.printStackTrace();
}finally {
// 6.关闭连接
if(resultSet != null) resultSet.close();
if(statement != null) statement.close();
if(connection != null) connection.close();
}
System.out.println("person 表的行数为:" + count);
}
}
代码解释:
通过Java访问Hive需要依赖Hive提供的JDBC驱动,操作步骤与Java访问MySQL基本类似。
其中jdbc:hive2://master001:10000 部分,代表JDBC协议,hive2是子协议,10000是某人端口号。其余部分和访问MySQL是类似的不再赘述。
2.2.3 效果截图
通过上图可以清楚的看到是转化成为了MapReduce程序。
3. 再来举个栗子
实例代码:
import java.sql.*;
public class HiveTest {
private static final String DRIVER = "org.apache.hive.jdbc.HiveDriver";
private static final String DATABASE_PATH = "jdbc:hive2://master001:10000/lhd";
private static final String USER_NAME = "hadoop";
private static final String PASSWORD = "";
private static Connection connection = null;
private static Statement statement = null;
private static ResultSet resultSet = null;
private static final String HQL = "select * from person";
public static void main(String[] args) throws SQLException {
try{
// 1.加载驱动
Class.forName(DRIVER);
// 2.创建链接
connection = DriverManager.getConnection(DATABASE_PATH, USER_NAME, PASSWORD);
// 3.创建statement对象
statement = connection.createStatement();
// 4.执行HQL语句
resultSet = statement.executeQuery(HQL);
// 5.处理结果集
System.out.println("编号" + "\t" + "姓名" + "\t" + "年龄" + "\t" + "生活" + "\t" + "位置");
while(resultSet.next()){
System.out.println(resultSet.getString(1)+ "\t" + resultSet.getString(2)
+ "\t" + resultSet.getString(3)+ "\t" + resultSet.getString(4)
+ "\t" + resultSet.getString(5));
}
}catch (Exception e){
e.printStackTrace();
}finally {
// 6.关闭连接
if(resultSet != null) resultSet.close();
if(statement != null) statement.close();
if(connection != null) connection.close();
}
}
}
效果截图:
可以看出在执行简单的查询整个表的语句时,是没有转化成mapreduce程序的而是hive直接就读取了整个表。