Connectez-vous de Java à Hive à l'aide de JDBC
J'essaie de me connecter de Java au serveur Hive 1. J'ai trouvé il y a une période de questions 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 indiqué dans le guide. J'ai copié hive-metastore, service, jdbc, exec, core et plus encore .jar dans le même chemin de la .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?
3 answers
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é Class.forName(driverName)
instruction dans votre code
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 Hive server 2, cela devrait être comme suit:
org.apache.hive.jdbc.HiveDriver
jdbc:hive2://<host>:<port>/<db>
J'ai utilisé le même exemple que vous avez donné et je suis capable de 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>
U besoin de changer sur 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 la seconde est utilisez ceci
jdbc:hive2://localhost:10000/default", "", ""
Au Lieu de
jdbc:hive://localhost:10000/default", "", ""