I'm trying to connect from Java to Hive server 1. I found a question time ago in this forum but it doesn't work for me. I'm using this code:
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)); }
That's the code shown in the guide. I've copied hive-metastore, service, jdbc, exec, core and more .jar in the same path of the .java. When I compile it, I get this msg:
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)
Does anybody know what's happening here?
Hive can be accessed via JDBC through the gateway that is automatically installed and configured in your cluster. If your cluster configuration includes Hive LLAP, then Hive LLAP is configured with the gateway; otherwise, HiveServer2 is configured.
The Cloudera JDBC Driver for Apache Hive complies with the JDBC 4.1 and 4.2 data standards. JDBC is one of the most established and widely supported APIs for connecting to and working with databases. At the heart of the technology is the JDBC driver, which connects an application to the database.
Create a Connection to Hive DataIn the Databases menu, click New Connection. In the Create new connection wizard that results, select the driver. On the next page of the wizard, click the driver properties tab. Enter values for authentication credentials and other properties required to connect to Hive.
Try
private static String driverName = "org.apache.hive.jdbc.HiveDriver"
instead of
private static String driverName = "org.apache.hadoop.hive.jdbc.HiveDriver";
I hope you have added Class.forName(driverName)
statement in your code
I think in your question you said its Hive server 1. If so the driver name and connection string should be as follows:
"org.apache.hadoop.hive.jdbc.HiveDriver" jdbc:hive://localhost:10000/default", "", "")
If you are using Hive server 2 , then it should be as follows:
org.apache.hive.jdbc.HiveDriver jdbc:hive2://<host>:<port>/<db>
I have used the same sample as you given and I am able to connect Hive with following dependencies in my pom.xml
<dependency> <groupId>org.apache.hive</groupId> <artifactId>hive-metastore</artifactId> <version>0.12.0-cdh5.0.0</version> </dependency> <dependency> <groupId>org.apache.hive</groupId> <artifactId>hive-service</artifactId> <version>0.12.0-cdh5.0.0</version> </dependency> <!-- runtime Hive --> <dependency> <groupId>org.apache.hive</groupId> <artifactId>hive-common</artifactId> <version>0.12.0-cdh5.0.0</version> <scope>runtime</scope> </dependency> <dependency> <groupId>org.apache.hive</groupId> <artifactId>hive-beeline</artifactId> <version>0.12.0-cdh5.0.0</version> <scope>runtime</scope> </dependency> <dependency> <groupId>org.apache.hive</groupId> <artifactId>hive-jdbc</artifactId> <version>0.12.0-cdh5.0.0</version> <scope>runtime</scope> </dependency> <dependency> <groupId>org.apache.hive</groupId> <artifactId>hive-shims</artifactId> <version>0.12.0-cdh5.0.0</version> <scope>runtime</scope> </dependency> <dependency> <groupId>org.apache.hive</groupId> <artifactId>hive-serde</artifactId> <version>0.12.0-cdh5.0.0</version> <scope>runtime</scope> </dependency> <dependency> <groupId>org.apache.hive</groupId> <artifactId>hive-contrib</artifactId> <version>0.12.0-cdh5.0.0</version> <scope>runtime</scope> </dependency> <dependency>
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With