gpt4 book ai didi

c - Hive JDBC 连接没有错误或警告

转载 作者:太空宇宙 更新时间:2023-11-04 04:34:58 25 4
gpt4 key购买 nike

我正在尝试使用 JNI 通过 C 调用 java 程序。 Java 程序基本上是与 Hive 的 JDBC 连接。

这是我的代码片段

Java程序

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", "cloudera", "cloudera");
//Connection con = DriverManager.getConnection("jdbc:hive2://");
Statement stmt = con.createStatement();
String tableName = "testHiveDriverTable";
stmt.execute("drop table if exists " + tableName);
stmt.execute("create table " + tableName + " (key int, value string)");
String sql = "show tables '" + tableName + "'";
System.out.println("Running: " + sql);
ResultSet res = stmt.executeQuery(sql);
if (res.next()) {
System.out.println(res.getString(1));
}

}
}

我的 C 程序看起来像这样

  #include<stdio.h>
#include "jni.h"

int main ( void )
{
char cpath;
JNIEnv *env;
JavaVM *jvm;
int res;
jclass cls;
jmethodID mid = NULL;

//JavaVMOption options;
JavaVMOption options [3];
options[0].optionString="-Djava.class.path=desired-classpath";
options[1].optionString = "-verbose:class";
options[2].optionString = "-Xdebug";
JavaVMInitArgs vm_args;
vm_args.version = JNI_VERSION_1_6;
vm_args.options = options;
vm_args.nOptions = 3;


res = JNI_CreateJavaVM (&jvm, (void **)&env, &vm_args);
if(res < 0 || !env)
printf("\nUnable to Launch JVM\n");
else
printf("**JVM launched successfully**\n");


cls = ( * env) -> FindClass(env, "HiveJdbcClient2");
printf("**cls**:\n",cls);
if (cls!=NULL)
printf("**HiveJdbcClient2 find success**\n");
else
printf("**Something happend with FindClass\n");

mid = (* env) -> GetStaticMethodID (env,cls, "main", "([Ljava/lang/String;)V");
if (mid!=0)
{
printf("**GetStaticMethodID success -test worked**\n");
(* env) -> CallStaticVoidMethod (env, cls, mid, NULL);
}

(* jvm) -> DestroyJavaVM (jvm);
return 0;

当我只运行 java 程序时,jdbc 连接似乎可以工作。但是,当通过 C 程序调用时,执行会在 DriverManager.getConnection() 处停止,而不会出现任何错误消息或警告。我检查过 hiverserver2 是否正在运行。是否需要像在 hive-site.xml 中那样进行任何其他配置?我正在使用 cloudera CDH virtualbox,所以没有执行任何额外的配置。我在这个网站上看到了几个类似的查询和解决方案,但对我没有任何帮助....

最佳答案

我通过捕获 JNI 调用中的异常解决了这个问题。顺便说一下,这个问题是缺少我在 -D.Java.path 中更正的类。

关于c - Hive JDBC 连接没有错误或警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31769430/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com