无法通过 jdbc 连接到 hive
Posted
技术标签:
【中文标题】无法通过 jdbc 连接到 hive【英文标题】:Can not connect to hive via jdbc 【发布时间】:2015-09-24 12:52:01 【问题描述】:我使用 gradle 来运行我的程序。示例代码参考https://github.com/onefoursix/Cloudera-Impala-JDBC-Example。
我可以从 repo 运行示例而不会失败。
// Apply the java plugin to add support for Java
apply plugin: 'java'
apply plugin: 'application'
mainClassName = "com.my.impala.fetcher.Fetcher"
// In this section you declare where to find the dependencies of your project
repositories
// Use 'jcenter' for resolving your dependencies.
// You can declare any Maven/Ivy/file repository here.
mavenCentral()
maven
url "https://repository.cloudera.com/artifactory/cloudera-repos/"
run
if (project.hasProperty("params"))
args params
// args Eval.me(params)
test
testLogging
events "passed", "skipped", "failed", "standardOut", "standardError"
// In this section you declare the dependencies for your production and test code
dependencies
// The production code uses the SLF4J logging API at compile time
compile 'org.slf4j:slf4j-api:1.7.7'
compile 'org.apache.hadoop:hadoop-client:2.6.0-cdh5.4.4.1'
compile 'org.json:json:20140107'
compile 'org.apache.hive:hive-jdbc:1.1.0'
示例代码如下。
Connection con = null;
ResultSet rs = null;
try
Class.forName(JDBC_DRIVER_NAME);
con = DriverManager.getConnection(CONNECTION_HOST);
Statement stmt = con.createStatement();
rs = stmt.executeQuery(sqlStatement);
catch (SQLException e)
e.printStackTrace();
System.exit(-1);
catch (Exception e)
e.printStackTrace();
System.exit(-1);
finally
try
con.close();
catch (Exception e)
e.printStackTrace();
System.exit(-1);
rs.next();
rs.next
会抛出以下异常的地方
org.apache.thrift.transport.TTransportException: Cannot write to null outputStream
at org.apache.thrift.transport.TiostreamTransport.write(TIOStreamTransport.java:142)
at org.apache.thrift.protocol.TBinaryProtocol.writeI32(TBinaryProtocol.java:178)
at org.apache.thrift.protocol.TBinaryProtocol.writeMessageBegin(TBinaryProtocol.java:106)
at org.apache.thrift.TServiceClient.sendBase(TServiceClient.java:62)
at org.apache.hive.service.cli.thrift.TCLIService$Client.send_FetchResults(TCLIService.java:495)
at org.apache.hive.service.cli.thrift.TCLIService$Client.FetchResults(TCLIService.java:487)
at org.apache.hive.jdbc.HiveQueryResultSet.next(HiveQueryResultSet.java:360)
at com.my.impala.fetcher.Fetcher.main(Fetcher.java:54)
Exception in thread "main" java.sql.SQLException: Error retrieving next row
at org.apache.hive.jdbc.HiveQueryResultSet.next(HiveQueryResultSet.java:388)
at com.my.impala.fetcher.Fetcher.main(Fetcher.java:54)
Caused by: org.apache.thrift.transport.TTransportException: Cannot write to null outputStream
at org.apache.thrift.transport.TIOStreamTransport.write(TIOStreamTransport.java:142)
at org.apache.thrift.protocol.TBinaryProtocol.writeI32(TBinaryProtocol.java:178)
at org.apache.thrift.protocol.TBinaryProtocol.writeMessageBegin(TBinaryProtocol.java:106)
at org.apache.thrift.TServiceClient.sendBase(TServiceClient.java:62)
at org.apache.hive.service.cli.thrift.TCLIService$Client.send_FetchResults(TCLIService.java:495)
at org.apache.hive.service.cli.thrift.TCLIService$Client.FetchResults(TCLIService.java:487)
at org.apache.hive.jdbc.HiveQueryResultSet.next(HiveQueryResultSet.java:360)
... 1 more
我不确定我错过了哪一部分。
谢谢。
【问题讨论】:
【参考方案1】:您已经关闭了连接,当然您无法读取结果。 rs.next()
应该在 executeQuery()
行之后,在 try 块的末尾,如下所示:
rs = stmt.executeQuery(sqlStatement);
while (rs.next())
// handle the record
ResultSet
是一个数据库游标,它不包含整个数据集,你可以通过它访问数据库中的数据。
【讨论】:
这很有帮助。以上是关于无法通过 jdbc 连接到 hive的主要内容,如果未能解决你的问题,请参考以下文章
无法使用 Zookeeper 连接字符串通过 JDBC 连接到 Hive