java通过JDBC驱动连接操作hive实例

Hive提供了jdbc驱动,使得我们可以用java代码来连接Hive并进行一些类关系型数据库的sql语句查询等操作。首先,我们必须将Hive的服务,也就是HiveServe打开。在Hive 0.11.0版本前,只有HiveServer服务可用,但是HiveServer本身存在很多问题(比如:安全性、并发性等);针对这些问题,Hive-0.11.0版本后提供了一个全新的服务:HiveServer2,这个很好的解决HiveServer存在的安全性、并发性等问题。

两种服务的启动方式基本一样。如下:

[plain]  view plain  copy
  1. ./bin/hive --service hiveserver  
  2.   
  3. ./bin/hive --service hiveserver2  

启动hiveserver(2)服务后,你就可以通过java代码来连接hiveserver并进行相应的hive操作了。示例代码如下:

[java]  view plain  copy
  1. package com.aturbo.hadoop;  
  2.   
  3. import java.sql.Connection;  
  4. import java.sql.DriverManager;  
  5. import java.sql.ResultSet;  
  6. import java.sql.Statement;  
  7.   
  8. public class Hive {  
  9.   
  10.     public static void main(String args[])throws Exception{  
  11.         Class.forName("org.apache.hadoop.hive.jdbc.HiveDriver");  
  12.           
  13.         //String dropSQL = "drop table javabloger";  
  14.         //String createSQL = "create table javabloger(key int,value string)";  
  15.         //String insertSQL = "load data local inpath '/home/congcong.ai/hive/kv1.txt'"  
  16.         //      + "overwrite into table javabloger";  
  17.          // String querySQL = "select a.* from javabloger a";  
  18.           String querySQL = "select * from pokes";  
  19.           Connection con = DriverManager.getConnection("jdbc:hive://localhost:10000/default""""");  
  20.           Statement stmt = con.createStatement();  
  21.           //stmt.executeQuery(dropSQL);  
  22.           //stmt.executeQuery(createSQL);  
  23.           //stmt.executeQuery(insertSQL);  
  24.           ResultSet res = stmt.executeQuery(querySQL);  
  25.           while(res.next()){  
  26.               System.out.println("Result: key:"+res.getString(1) +"  –>  value:" +res.getString(2));  
  27.           }  
  28.     }  
  29. }  

上面代码是针对hiveserver的。如果是hiveserver2。那有两处需要修改,具体修改如下:

org.apache.hadoop.hive.jdbc.HiveDriver

改为:

org.apache.hive.jdbc.HiveDriver


jdbc:hive://localhost:10000/default

改为:

jdbc:hive2://localhost:10000/default

 

其中’localhost’是主机地址,10000是端口后,default是默认的db。

接下来就可以编译、运行上面的代码了。

本人使用的开发环境是linux(centos 7)。没有安装eclipse。所以这里只讲用脚本的方式运行。

1) 首先创建一个文件夹/hive。(本人创建的该文件夹绝对路径:/home/workspace/hive)

2)    在hive下面分别创建三文件夹:src/、classes/、lib/。其中,src保存源码(也就是上面的代码,命名为Hive.java),classes保存编译后的.class文件。lib存放依赖的jar包。

3)    在lib下存放依赖jar包:

java通过JDBC驱动连接操作hive实例_第1张图片

4)     编译Hive.java,并保持到/classes目录下:

      javac -d ./classes/ ./src/*.java

5)    将/classes/打包成jar,并放在当前路径下(/home/workspace/hive):

[plain]  view plain  copy
  1. [root@localhost hive]# jar cvf hive.jar -C ./classes/ .  
  2. 已添加清单  
  3. 正在添加: com/(输入 = 0) (输出 = 0)(存储了 0%)  
  4. 正在添加: com/aturbo/(输入 = 0) (输出 = 0)(存储了 0%)  
  5. 正在添加: com/aturbo/hadoop/(输入 = 0) (输出 = 0)(存储了 0%)  
  6. 正在添加: com/aturbo/hadoop/Hive.class(输入 = 1596) (输出 = 926)(压缩了 41%)  

6)创建脚本——run.sh,内容如下:

[plain]  view plain  copy
  1.    #!/bin/bash  
  2. HADOOP_HOME=/home/aturbo/hadoop/hadoop-1.2.1  
  3. HIVE_HOME=/home/aturbo/hive/hive.1.2.1  
  4.   
  5. CLASSPATH=$CLASSPATH:  
  6.   
  7. for i in /home/workspace/hive/lib/*.jar;do  
  8.      CLASSPATH=$CLASSPATH:$i  
  9. done  
  10.   
  11. echo $CLASSPATH  
  12. java -cp $CLASSPATH:/home/workspace/hive/hive.jar com.aturbo.hadoop.Hive  

7)给run.sh赋予可执行权限,或直接sourcerun.sh,开始连接hive,并执行代码。如果运行成功,服务端后输出:OK。客户端输出:

[plain]  view plain  copy
  1. 15/10/16 15:04:23 INFO jdbc.Utils: Supplied authorities: localhost:10000  
  2. 15/10/16 15:04:23 INFO jdbc.Utils: Resolved authority: localhost:10000  
  3. 15/10/16 15:04:23 INFO jdbc.HiveConnection: Will try to open client transport with JDBC Uri: jdbc:hive2://localhost:10000/default  
  4. Result: key:1  –>  value:wyp  
  5. Result: key:2  –>  value:test  
  6. Result: key:3  –>  value:zs  
  7. Result: key:1  –>  value:wyp  
  8. Result: key:2  –>  value:test  
  9. Result: key:3  –>  value:zs  
  10. Result: key:1  –>  value:wyp  
  11. Result: key:2  –>  value:test  
  12. Result: key:3  –>  value:zs  
  13. Result: key:1  –>  value:wyp  
  14. Result: key:2  –>  value:test  
  15. Result: key:3  –>  value:zs  

至此,整个通过JDBC驱动连接hive并操作的实例就完成了。

 

注意:

Hive是基于Hadoop的,所以,在连接hive时,务必已经启动了hadoop。具体hadoop的安装启动等,推荐下载阅读

最短路径系列之一从零开始学习Hadoop

此外,如果出现连接

com.mysql.jdbc.exceptions.jdbc4.CommunicationsException:Communications link failure

说明,hive元数据关联的mysql数据库没有启动。

关于hive元数据库的修改,推荐阅读:HIVE完全分布式集群安装过程(元数据库:MySQL)。


其他参考文献:

http://www.aboutyun.com/thread-7461-1-1.html

 

http://www.aboutyun.com/thread-7083-1-1.html

你可能感兴趣的:(Java开发,hive)