Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Connect from Java to Hive using JDBC

Tags:

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?

like image 744
adrian Avatar asked Aug 06 '14 09:08

adrian


People also ask

How Hive data can be accessed using JDBC?

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.

Does Hive support JDBC?

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.

How do I connect to the Hive 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.


2 Answers

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

like image 129
Santhosh Avatar answered Oct 11 '22 04:10

Santhosh


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> 
like image 26
scalauser Avatar answered Oct 11 '22 02:10

scalauser