无法通过jdbc驱动程序从配置单元UDF内部执行SQL
这是我的第一篇帖子!我一直在寻找解决这个问题的方法,但几个星期都没有结果(断断续续) 我有一个java配置单元UDF,我想在其中对配置单元表运行SQL,以映射内存中的数据,供以后使用。我有正确的连接信息,但它找不到HiveDriver。我已经尝试在配置单元中添加配置单元jdbc驱动程序jar,并将其导出到可运行的jar中 下面是错误,后面是相关代码无法通过jdbc驱动程序从配置单元UDF内部执行SQL,jdbc,hive,udf,Jdbc,Hive,Udf,这是我的第一篇帖子!我一直在寻找解决这个问题的方法,但几个星期都没有结果(断断续续) 我有一个java配置单元UDF,我想在其中对配置单元表运行SQL,以映射内存中的数据,供以后使用。我有正确的连接信息,但它找不到HiveDriver。我已经尝试在配置单元中添加配置单元jdbc驱动程序jar,并将其导出到可运行的jar中 下面是错误,后面是相关代码 hive> add jar /tmp/xhUDFs.jar; Added [/tmp/xhUDFs.jar] to class path Ad
hive> add jar /tmp/xhUDFs.jar;
Added [/tmp/xhUDFs.jar] to class path
Added resources: [/tmp/xhUDFs.jar]
hive> CREATE TEMPORARY FUNCTION getRefdata as 'xhUDFs.GetRefdata';
OK
Time taken: 0.042 seconds
hive> select '06001',getRefdata('CBSAname','06001');
java.lang.ClassNotFoundException:
org.apache.hadoop.hive.jdbc.HiveDriver
位于java.net.URLClassLoader.findClass(URLClassLoader.java:381)
位于java.lang.ClassLoader.loadClass(ClassLoader.java:424)
位于java.lang.ClassLoader.loadClass(ClassLoader.java:357)
位于java.lang.Class.forName0(本机方法)
位于java.lang.Class.forName(Class.java:264)
位于xhUDFs.GetRefdata.getRefmap(GetRefdata.java:53)
在xhUDFs.GetRefdata.evaluate处(GetRefdata.java:35)
在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处
位于sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)中
位于java.lang.reflect.Method.invoke(Method.java:497)
位于org.apache.hadoop.hive.ql.exec.FunctionRegistry.invoke(FunctionRegistry.java:954)
位于org.apache.hadoop.hive.ql.udf.generic.GenericUDFBridge.evaluate(GenericUDFBridge.java:182)
位于org.apache.hadoop.hive.ql.udf.generic.GenericUDF.initializeAndFoldConstants(GenericUDF.java:168)
位于org.apache.hadoop.hive.ql.plan.exprnodegenericfundesc.newInstance(exprnodegenericfundesc.java:233)
位于org.apache.hadoop.hive.ql.parse.TypeCheckProcFactory$DefaultExprProcessor.getXPathFuncExprNodedesc(TypeCheckProcFactory.java:1093)
位于org.apache.hadoop.hive.ql.parse.TypeCheckProcFactory$DefaultExprProcessor.process(TypeCheckProcFactory.java:1312)
位于org.apache.hadoop.hive.ql.lib.DefaultRuleDispatcher.dispatch(DefaultRuleDispatcher.java:90)
在org.apache.hadoop.hive.ql.lib.DefaultGraphWalker.dispatchAndReturn上(DefaultGraphWalker.java:95)
在org.apache.hadoop.hive.ql.lib.DefaultGraphWalker.dispatch(DefaultGraphWalker.java:79)上
位于org.apache.hadoop.hive.ql.lib.DefaultGraphWalker.walk(DefaultGraphWalker.java:133)
位于org.apache.hadoop.hive.ql.lib.DefaultGraphWalker.startWalking(DefaultGraphWalker.java:110)
位于org.apache.hadoop.hive.ql.parse.TypeCheckProcFactory.genExprNode(TypeCheckProcFactory.java:209)
位于org.apache.hadoop.hive.ql.parse.TypeCheckProcFactory.genExprNode(TypeCheckProcFactory.java:153)
位于org.apache.hadoop.hive.ql.parse.semanticalyzer.genAllExprNodeDesc(semanticalyzer.java:10499)
位于org.apache.hadoop.hive.ql.parse.semanticalyzer.genExprNodeDesc(semanticalyzer.java:10455)
位于org.apache.hadoop.hive.ql.parse.semanticalyzer.genSelectPlan(semanticalyzer.java:3822)
位于org.apache.hadoop.hive.ql.parse.semanticalyzer.genSelectPlan(semanticalyzer.java:3601)
位于org.apache.hadoop.hive.ql.parse.semanticalyzer.genPostGroupByBodyPlan(semanticalyzer.java:8943)
位于org.apache.hadoop.hive.ql.parse.semanticalyzer.genBodyPlan(semanticalyzer.java:8898)
位于org.apache.hadoop.hive.ql.parse.semanticalyzer.genPlan(semanticalyzer.java:9743)
位于org.apache.hadoop.hive.ql.parse.semanticalyzer.genPlan(semanticalyzer.java:9636)
位于org.apache.hadoop.hive.ql.parse.semanticalyzer.genOPTree(semanticalyzer.java:10109)
位于org.apache.hadoop.hive.ql.parse.CalcitePlanner.genOPTree(CalcitePlanner.java:329)
位于org.apache.hadoop.hive.ql.parse.semanticalyzer.analyzeInternal(semanticalyzer.java:10120)
位于org.apache.hadoop.hive.ql.parse.CalcitePlanner.analyzeInternal(CalcitePlanner.java:211)
位于org.apache.hadoop.hive.ql.parse.basesemanticalyzer.analyze(basesemanticalyzer.java:227)
位于org.apache.hadoop.hive.ql.Driver.compile(Driver.java:454)
位于org.apache.hadoop.hive.ql.Driver.compile(Driver.java:314)
位于org.apache.hadoop.hive.ql.Driver.compileInternal(Driver.java:1164)
位于org.apache.hadoop.hive.ql.Driver.runInternal(Driver.java:1212)
位于org.apache.hadoop.hive.ql.Driver.run(Driver.java:1101)
位于org.apache.hadoop.hive.ql.Driver.run(Driver.java:1091)
位于org.apache.hadoop.hive.cli.CliDriver.processLocalCmd(CliDriver.java:216)
位于org.apache.hadoop.hive.cli.CliDriver.processCmd(CliDriver.java:168)
位于org.apache.hadoop.hive.cli.CliDriver.processLine(CliDriver.java:379)
位于org.apache.hadoop.hive.cli.CliDriver.executeDriver(CliDriver.java:739)
位于org.apache.hadoop.hive.cli.CliDriver.run(CliDriver.java:684)
位于org.apache.hadoop.hive.cli.CliDriver.main(CliDriver.java:624)
在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处
位于sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)中
位于java.lang.reflect.Method.invoke(Method.java:497)
位于org.apache.hadoop.util.RunJar.run(RunJar.java:221)
位于org.apache.hadoop.util.RunJar.main(RunJar.java:136)java.lang.ClassNotFoundException:
org.apache.hadoop.hive.jdbc.HiveDriver
现在,代码片段:
try {
Class.forName("org.apache.hadoop.hive.jdbc.HiveDriver");
Connection wConn = DriverManager.getConnection("jdbc:hive2://172.20.2.40:10000/refdata", "", "");
Statement sql = wConn.createStatement();
ResultSet wResult = sql.executeQuery("select distinct zipcode5,cbsa_name,msa_name,pmsa_name,region,csaname,cbsa_div_name from refdata.zip_code_business_all_16_1_2016_orc where primaryrecord='P'");
while (wResult.next()){
censusMap.put(wResult.getString("zipcode5"), wResult.getString("cbsa_name"));
}
} catch (SQLException | ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
出于好奇,您是否尝试添加jar/where/my/distro/is/hive/hive-jdbc-xxxxxx-standalone.jar代码>?而且,看起来您只是希望Java HashMap在UDF中执行查找,而不是运行配置单元映射联接。好吧,看到人们重新发明轮子总是很有趣的,尤其是当他们失败的时候。但为什么是JDBC?存储在HDFS上的好的旧CSV文件将更容易从Java代码中读取。你可以跑呀