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

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




[plain] view plain copy print ?


1. ./bin/hive --service hiveserver  
2.   
3. ./bin/hive --service hiveserver2


./bin/hive --service hiveserver

./bin/hive --service hiveserver2



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



[java] view plain copy print ?



1. package
2.   
3. import
4. import
5. import
6. import
7.   
8. public class
9.   
10. public static void main(String args[])throws
11. "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. "select * from pokes";  
19. "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. "Result: key:"+res.getString(1) +"  –>  value:" +res.getString(2));  
27.           }  
28.     }  
29. }  
 
  
package com.aturbo.hadoop;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

public class Hive {

	public static void main(String args[])throws Exception{
		Class.forName("org.apache.hadoop.hive.jdbc.HiveDriver");
		
		//String dropSQL = "drop table javabloger";
		//String createSQL = "create table javabloger(key int,value string)";
		//String insertSQL = "load data local inpath '/home/congcong.ai/hive/kv1.txt'"
		//		+ "overwrite into table javabloger";
		 // String querySQL = "select a.* from javabloger a";
		  String querySQL = "select * from pokes";
		  Connection con = DriverManager.getConnection("jdbc:hive://localhost:10000/default", "", "");
		  Statement stmt = con.createStatement();
		  //stmt.executeQuery(dropSQL);
		  //stmt.executeQuery(createSQL);
		  //stmt.executeQuery(insertSQL);
		  ResultSet res = stmt.executeQuery(querySQL);
		  while(res.next()){
			  System.out.println("Result: key:"+res.getString(1) +"  –>  value:" +res.getString(2));
		  }
	}
} 
  
上面代码是针对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包:



api hive java 手册 java操作hive_java



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

     

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


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



[plain] view plain copy print ?



  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%)  



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



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



[plain] view plain copy print ?


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



#!/bin/bash
HADOOP_HOME=/home/aturbo/hadoop/hadoop-1.2.1
HIVE_HOME=/home/aturbo/hive/hive.1.2.1

CLASSPATH=$CLASSPATH:

for i in /home/workspace/hive/lib/*.jar;do
     CLASSPATH=$CLASSPATH:$i
done

echo $CLASSPATH
java -cp $CLASSPATH:/home/workspace/hive/hive.jar com.aturbo.hadoop.Hive



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



[plain] view plain copy print ?


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



15/10/16 15:04:23 INFO jdbc.Utils: Supplied authorities: localhost:10000
15/10/16 15:04:23 INFO jdbc.Utils: Resolved authority: localhost:10000
15/10/16 15:04:23 INFO jdbc.HiveConnection: Will try to open client transport with JDBC Uri: jdbc:hive2://localhost:10000/default
Result: key:1  –>  value:wyp
Result: key:2  –>  value:test
Result: key:3  –>  value:zs
Result: key:1  –>  value:wyp
Result: key:2  –>  value:test
Result: key:3  –>  value:zs
Result: key:1  –>  value:wyp
Result: key:2  –>  value:test
Result: key:3  –>  value:zs
Result: key:1  –>  value:wyp
Result: key:2  –>  value:test
Result: key:3  –>  value:zs



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

 

注意:

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

此外,如果出现连接

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

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

安全性、并发性等);针对这些问题,Hive-0.11.0版本后提供了一个全新的服务:HiveServer2,这个很好的解决HiveServer存在的安全性、并发性等问题。

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




[plain] view plain copy print ?



    1. ./bin/hive --service hiveserver  
    2.   
    3. ./bin/hive --service hiveserver2



    ./bin/hive --service hiveserver
    
    ./bin/hive --service hiveserver2



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



    [java] view plain copy print ?


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


    上面代码是针对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包:



    api hive java 手册 java操作hive_java



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

         

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


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



    [plain] view plain copy print ?



    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%)



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



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



    [plain] view plain copy print ?



      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



      #!/bin/bash
      HADOOP_HOME=/home/aturbo/hadoop/hadoop-1.2.1
      HIVE_HOME=/home/aturbo/hive/hive.1.2.1
      
      CLASSPATH=$CLASSPATH:
      
      for i in /home/workspace/hive/lib/*.jar;do
           CLASSPATH=$CLASSPATH:$i
      done
      
      echo $CLASSPATH
      java -cp $CLASSPATH:/home/workspace/hive/hive.jar com.aturbo.hadoop.Hive



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



      [plain] view plain copy print ?


      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


      15/10/16 15:04:23 INFO jdbc.Utils: Supplied authorities: localhost:10000
      15/10/16 15:04:23 INFO jdbc.Utils: Resolved authority: localhost:10000
      15/10/16 15:04:23 INFO jdbc.HiveConnection: Will try to open client transport with JDBC Uri: jdbc:hive2://localhost:10000/default
      Result: key:1  –>  value:wyp
      Result: key:2  –>  value:test
      Result: key:3  –>  value:zs
      Result: key:1  –>  value:wyp
      Result: key:2  –>  value:test
      Result: key:3  –>  value:zs
      Result: key:1  –>  value:wyp
      Result: key:2  –>  value:test
      Result: key:3  –>  value:zs
      Result: key:1  –>  value:wyp
      Result: key:2  –>  value:test
      Result: key:3  –>  value:zs



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

       

      注意:

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

      此外,如果出现连接

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

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

      关于hive元数据库的修改,