通过JDBC连接Hive Server2,首先要准备好JDBC连接所需要的JAR包。
C:\Program Files\DbVisualizer\jdbc\hive\commons-logging-1.1.3.jar
C:\Program Files\DbVisualizer\jdbc\hive\hadoop-common-2.3.0-cdh5.1.3.jar
C:\Program Files\DbVisualizer\jdbc\hive\hive-common-0.12.0-cdh5.1.3.jar
C:\Program Files\DbVisualizer\jdbc\hive\hive-exec-0.12.0-cdh5.1.3.jar
C:\Program Files\DbVisualizer\jdbc\hive\hive-jdbc-0.12.0-cdh5.1.3.jar
C:\Program Files\DbVisualizer\jdbc\hive\hive-metastore-0.12.0-cdh5.1.3.jar
C:\Program Files\DbVisualizer\jdbc\hive\hive-service-0.12.0-cdh5.1.3.jar
C:\Program Files\DbVisualizer\jdbc\hive\libfb303-0.9.0.jar
C:\Program Files\DbVisualizer\jdbc\hive\log4j-1.2.16.jar
C:\Program Files\DbVisualizer\jdbc\hive\slf4j-api-1.7.5.jar
C:\Program Files\DbVisualizer\jdbc\hive\slf4j-log4j12-1.7.5.jar
C:\Program Files\DbVisualizer\jdbc\hive\httpclient-4.2.5.jar
C:\Program Files\DbVisualizer\jdbc\hive\httpcore-4.2.5.jar
如果没添加最后两个,可能会出现下面的报错
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/http/HttpRequestInterceptor
at org.apache.hive.jdbc.HiveDriver.connect(HiveDriver.java:105)
at java.sql.DriverManager.getConnection(DriverManager.java:571)
at java.sql.DriverManager.getConnection(DriverManager.java:215)
at com.simon.HiveJDBCTest.main(HiveJDBCTest.java:33)
Caused by: java.lang.ClassNotFoundException: org.apache.http.HttpRequestInterceptor
at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
... 4 more
private static String driverName = "org.apache.hive.jdbc.HiveDriver";
连接URL
private static String url = "jdbc:hive2://:/" ;
如果需要设置队列
private static String url = "jdbc:hive2://:/?mapred.job.queue.name=" ;
使用聚集函数
private static String url = "jdbc:hive2://:/?mapred.job.queue.name=;hive.mapred.mode=nonstrict" ;
在Apache官方的wiki上,有关于连接URL的详细帮助
The HiveServer2 URL is a string with the following syntax:
jdbc:hive2://<host1>:<port1>,<host2>:<port2>/dbName;initFile=<file>;sess_var_list?hive_conf_list#hive_var_list
where
is a server instance or a comma separated list of server instances to connect to (if dynamic service discovery is enabled). If empty, the embedded server will be used.
: , : dbName is the name of the initial database.
is the path of init script file (Hive 2.2.0 and later). This script file is written with SQL statements which will be executed automatically after connection. This option can be empty.
hive_conf_list is a semicolon separated list of key=value pairs of Hive configuration variables for this session
hive_var_list is a semicolon separated list of key=value pairs of Hive variables for this session.
说明一下
<property>
<name>hive.server2.support.dynamic.service.discoveryname>
<value>truevalue>
property>
关于initFile,可以把脚本写到命令里,默认执行这里面的脚本,这个属于Hive2.2.0版本之后的功能
关于hive_conf_list
当URL里面没有hive_conf_list ,也就是格式如下
private static String url = "jdbc:hive2://:/?mapred.job.queue.name=;hive.mapred.mode=nonstrict" ;
代码如下:
conn = DriverManager.getConnection(url, user,password );
而当URL里面包含了sess_var_list,如下:
private static String url = "jdbc:hive2://:/;username=username;password=password?mapred.job.queue.name=;hive.mapred.mode=nonstrict" ;
连接代码是
conn = DriverManager.getConnection(url);
try {
Class.forName(driverName);
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.exit(1);
}
conn = DriverManager.getConnection(url, user,password);
或者是
conn = DriverManager.getConnection(url);
stmt = conn.createStatement();
例如,查看所有的表:
sql = "show tables";
或者,统计test表有多少记录
sql = "select count(1) from test";
res = stmt.executeQuery(sql);
while(res.next()) {
System.out.println(res.getString(1));
}
if (stmt != null) {
stmt.close();
stmt = null;
}
if (conn != null) {
conn.close();
conn = null;
}
注意,关闭statement和connection都要捕捉异常。整个过程可以使用try/catch/finally完成,将关闭异常处理放在finally里面。
详细资料,请使用
参考文档
https://cwiki.apache.org/confluence/display/Hive/HiveServer2+Clients