使用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", "", ""