Conectarea din Java la Hive utilizând JDBC (Programare, Java, Hadoop, Jdbc, Hive)

adrian a intrebat.
a intrebat.

Încerc să mă conectez din Java la serverul Hive 1.Am găsit o întrebare cu ceva timp în urmă pe acest forum, dar nu funcționează pentru mine.Folosesc acest cod:

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));
}

Acesta este codul prezentat în ghid. Am copiat hive-metastore, service, jdbc, exec, core și mai multe .jar în aceeași cale cu .java. Când îl compilez, primesc acest 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)

Știe cineva ce se întâmplă aici?

Comentarii

  • V-ați asigurat că clasa driverului este încărcată de classloaderul curent? Nu am mai făcut JDBC de ani de zile, dar ar trebui să existe un Class.forName("org.apache.hadoop.hive.jdbc.HiveDriver") ? De asemenea, asigurați-vă că hive-jdbc JAR este în classpath. –  > Por NINCOMPOOP.
3 răspunsuri
Santhosh

Încercați

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

în loc de

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

Sper că ați adăugat Class.forName(driverName) declarație în codul dvs.

Comentarii

  • Bună! Am schimbat deja driverName și primesc același mesaj. Ce vrei să spui cu class.forName(driverName) ? mulțumesc 🙂 –  > Por adrian.
  • este pentru a stabili conexiunea cu HiveDriver prin java. citește aici –  > Por Santhosh.
  • vă referiți la înlocuirea private static String driverName = „org.apache.hive.jdbc.HiveDriver” pentru class.forName(driverName) ? –  > Por adrian.
  • San Krish, am tastat deja acel cod și încă nu funcționează 🙁 –  > Por adrian.
scalauser

Cred că în întrebarea dvs. ați spus că este serverul Hive 1. Dacă este așa, numele driverului și șirul de conexiune ar trebui să fie după cum urmează:

"org.apache.hadoop.hive.jdbc.HiveDriver"

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

Dacă folosiți serverul Hive 2 , atunci ar trebui să fie după cum urmează:

org.apache.hive.jdbc.HiveDriver

jdbc:hive2://<host>:<port>/<db>

Am folosit același exemplu ca și cel dat de dvs. și pot conecta Hive cu următoarele dependențe în 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>

Comentarii

  • Bună ziua! Ați adăugat aceste dependențe la „pom.xml” stocat în dosarul hive? –  > Por adrian.
  • Nu, în proiectul meu maven al aplicației java de mai sus. –  > Por scalauser.
  • satha, am primit acest mesaj acum… Cauzat de: java.sql.SQLException: Nu s-a putut stabili o conexiune la localhost:10000/default: java.net.ConnectException: Conexiune refuzată –  > Por adrian.
  • Deci, ceea ce înseamnă că serverul dvs. hive este în jos. Sau vă rugăm să folosiți detaliile corecte ale serverului hive. –  > Por scalauser.
  • Știu că este o întrebare veche și rezolvată, dar m-am confruntat cu aceeași problemă și am rezolvat-o folosind doar două dependențe (hive sql, și hadoop core). Sper că ajută pe cineva în viitor. –  > Por Fanooos.
sharafat shaikh

u trebuie să schimbați în două locuri

utilizați acest lucru

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

în loc de

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

și în al doilea rând, utilizați acest lucru

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

în loc de

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