使用JDBC从Java连接到Hive

我正在尝试从Java连接到Hive服务器1.我在这个论坛上发现了一个问题,但它对我不起作用。 我正在使用此代码:

import java.sql.SQLException; import java.sql.Connection; import java.sql.ResultSet; import java.sql.Statement; import java.sql.DriverManager; public class HiveJdbcClient { private static String driverName = "org.apache.hive.jdbc.HiveDriver"; /** * @param args * @throws SQLException */ 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); } //replace "hive" here with the name of the user the queries should run as Connection con = DriverManager.getConnection("jdbc:hive2://localhost:10000/default", "hive", ""); Statement stmt = con.createStatement(); String tableName = "testHiveDriverTable"; stmt.execute("drop table if exists " + tableName); stmt.execute("create table " + tableName + " (key int, value string)"); // show tables String sql = "show tables '" + tableName + "'"; System.out.println("Running: " + sql); ResultSet res = stmt.executeQuery(sql); if (res.next()) { System.out.println(res.getString(1)); } // describe table sql = "describe " + tableName; System.out.println("Running: " + sql); res = stmt.executeQuery(sql); while (res.next()) { System.out.println(res.getString(1) + "\t" + res.getString(2)); } // load data into table // NOTE: filepath has to be local to the hive server // NOTE: /tmp/a.txt is a ctrl-A separated file with two fields per line String filepath = "/tmp/a.txt"; sql = "load data local inpath '" + filepath + "' into table " + tableName; System.out.println("Running: " + sql); stmt.execute(sql); // select * query sql = "select * from " + tableName; System.out.println("Running: " + sql); res = stmt.executeQuery(sql); while (res.next()) { System.out.println(String.valueOf(res.getInt(1)) + "\t" + res.getString(2)); } // regular hive query sql = "select count(1) from " + tableName; System.out.println("Running: " + sql); res = stmt.executeQuery(sql); while (res.next()) { System.out.println(res.getString(1)); } 

这是指南中显示的代码。 我在.java的同一路径中复制了hive-Metoreore,service,jdbc,exec,core和更多.jar。 当我编译它时,我得到这个消息:

 java.lang.ClassNotFoundException: org.apache.hadoop.hive.jdbc.HiveDriver 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) at java.lang.Class.forName0(Native Method) at java.lang.Class.forName(Class.java:190) at HiveJdbcClient.main(HiveJdbcClient.java:14) 

有人知道这里发生了什么吗?

尝试

 private static String driverName = "org.apache.hive.jdbc.HiveDriver" 

代替

 private static String driverName = "org.apache.hadoop.hive.jdbc.HiveDriver"; 

我希望你在代码中添加了Class.forName(driverName)语句

我想在你的问题中你说它的Hive服务器1.如果是这样,驱动程序名称和连接字符串应如下所示:

 "org.apache.hadoop.hive.jdbc.HiveDriver" jdbc:hive://localhost:10000/default", "", "") 

如果您使用的是Hive服务器2,那么它应该如下所示:

 org.apache.hive.jdbc.HiveDriver jdbc:hive2://:/ 

我已经使用了相同的示例,我可以在我的pom.xml中将Hive与以下依赖项连接起来

   org.apache.hive hive-metastore 0.12.0-cdh5.0.0   org.apache.hive hive-service 0.12.0-cdh5.0.0    org.apache.hive hive-common 0.12.0-cdh5.0.0 runtime   org.apache.hive hive-beeline 0.12.0-cdh5.0.0 runtime   org.apache.hive hive-jdbc 0.12.0-cdh5.0.0 runtime   org.apache.hive hive-shims 0.12.0-cdh5.0.0 runtime   org.apache.hive hive-serde 0.12.0-cdh5.0.0 runtime   org.apache.hive hive-contrib 0.12.0-cdh5.0.0 runtime   

你需要改变两个地方

用这个

 private static String driverName = "org.apache.hive.jdbc.HiveDriver" 

代替

 private static String driverName = "org.apache.hadoop.hive.jdbc.HiveDriver"; 

第二是使用这个

 jdbc:hive2://localhost:10000/default", "", "" 

代替

 jdbc:hive://localhost:10000/default", "", ""