You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用JDBC查询Hive表异常:期望ResultSet但未生成

问题:Java通过Impala JDBC执行查询SQL时抛出ResultSet未生成异常

SQL语句在Impala控制台可正常返回数据,但Java代码执行时抛出异常,已确认SQL语句本身正确。

代码示例

try (
    Connection conn = Objects.requireNonNull(jdbcTemplate.getDataSource()).getConnection();
    Statement stmt = conn.createStatement()
) {
    PreparedStatement statement = conn.prepareStatement(validationQuery);
    ResultSet rs = statement.executeQuery();
    while(rs.next()){
        log.info(rs.getString(1));
        log.info(rs.getString(2));
    }
}

异常信息

java.sql.SQLDataException: [Cloudera][JDBC](11300) A ResultSet was expected but not generated from query "....
    ". Query not executed. 
    at com.cloudera.impala.exceptions.ExceptionConverter.toSQLException(Unknown Source)
    at com.cloudera.impala.jdbc.common.SStatement.checkCondition(Unknown Source)
    at com.cloudera.impala.jdbc.common.SPreparedStatement.executeWithParams(Unknown Source)
    at com.cloudera.impala.jdbc.common.SPreparedStatement.executeQuery(Unknown Source)
    at com.zaxxer.hikari.pool.ProxyPreparedStatement.executeQuery(ProxyPreparedStatement.java:52)
    at com.zaxxer.hikari.pool.HikariProxyPreparedStatement.executeQuery(HikariProxyPreparedStatement.java)

查询SQL

with current as (
    select table_name,key_column_value, attribute_name from tableA
    where id= '6169646831575698485'
),
prev as (
select r.id,table_name,key_column_value, attribute_name,status,adj_request_status,value,original_value from TableA d
   inner join TableR r on r.id = d.id
   where date = '2023-06-15' and status in ('PASS') 
   and nvl(r.Datatype,'')='People'
   group by r.id,table_name,key_column_value, attribute_name,status,value,original_value
    )
select prev.id, prev.table_name , prev.key_column_value, prev.attribute_name,value,original_value from current 
inner join prev on current.key_column_value = prev.key_column_value
where current.table_name = prev.table_name
group by prev.id, prev.table_name , prev.key_column_value, prev.attribute_name,value,original_value

已尝试的其他方法

以下两种方式均出现相同异常:

  1. 使用queryForList:
List<Map<String, Object>> results = jdbcTemplate.queryForList(validationQuery);
  1. 使用query回调:
jdbcTemplate.query(validationQuery, resultSet -> {
    String Id = resultSet.getString(1);
    String table_name = resultSet.getString(2);
    String key_column_value = resultSet.getString(3);
    log.info("The following values are fetched from database");
});

排查方向与解决方法

1. 移除SQL语句末尾的分号

Impala JDBC驱动对查询语句末尾的分号敏感,若validationQuery中的SQL末尾带有分号,会被驱动识别为多语句分隔符,导致无法生成ResultSet。直接去掉分号后重试。

2. 升级Impala JDBC驱动版本

旧版本的Cloudera Impala JDBC驱动可能对CTE(WITH子句)语法支持不完善,导致无法正确解析查询语句。确保驱动版本与集群的Cloudera/Impala版本匹配,建议升级到对应集群版本的最新驱动。

3. 测试使用Statement替代PreparedStatement

尽管PreparedStatement更安全,但部分版本的Impala JDBC驱动对PreparedStatement处理CTE存在兼容问题。可尝试直接使用Statement执行查询:

try (
    Connection conn = Objects.requireNonNull(jdbcTemplate.getDataSource()).getConnection();
    Statement stmt = conn.createStatement()
) {
    ResultSet rs = stmt.executeQuery(validationQuery);
    while(rs.next()){
        log.info(rs.getString(1));
        log.info(rs.getString(2));
    }
}

4. 检查JDBC连接属性

确保连接URL中配置了正确的参数,比如:

  • 确认AuthMech参数符合集群认证方式(如无认证设为0,Kerberos设为1等)
  • 添加useUnicode=true&characterEncoding=UTF-8避免字符编码问题
  • 检查autoCommit设置,部分场景下需设置为true

内容的提问来源于stack exchange,提问作者Akanksha_p

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 03:52:48