web-dev-qa-db-fra.com

Connectez-vous de Java à Hive en utilisant JDBC

J'essaie de me connecter depuis Java au serveur Hive 1. J'ai trouvé une question il y a une heure dans ce forum mais cela ne fonctionne pas pour moi. J'utilise ce 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));
}

C'est le code affiché dans le guide. J'ai copié Hive-metastore, service, jdbc, exec, core et plus .jar dans le même chemin que le .Java. Quand je le compile, j'obtiens ce 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)

Quelqu'un sait-il ce qui se passe ici?

22
adrian

Essayer

private static String driverName = "org.Apache.Hive.jdbc.HiveDriver"

au lieu de

private static String driverName = "org.Apache.hadoop.Hive.jdbc.HiveDriver";

J'espère que vous avez ajouté la déclaration Class.forName(driverName) dans votre code

19
San Krish

Je pense que dans votre question, vous avez dit son serveur Hive 1. Si c'est le cas, le nom du pilote et la chaîne de connexion doivent être les suivants:

"org.Apache.hadoop.Hive.jdbc.HiveDriver"

jdbc:Hive://localhost:10000/default", "", "")

Si vous utilisez le serveur Hive 2, cela devrait être le suivant:

org.Apache.Hive.jdbc.HiveDriver

jdbc:Hive2://<Host>:<port>/<db>

J'ai utilisé le même échantillon que vous l'avez donné et je peux connecter Hive avec les dépendances suivantes dans mon 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>
12
scalauser

tu dois changer à deux endroits

utilisez ceci

private static String driverName = "org.Apache.Hive.jdbc.HiveDriver"

au lieu de

private static String driverName = "org.Apache.hadoop.Hive.jdbc.HiveDriver";

et le second est d'utiliser cette

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

au lieu de

jdbc:Hive://localhost:10000/default", "", ""
2
sharafat shaikh