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?
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
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>
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", "", ""