使用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
已尝试的其他方法
以下两种方式均出现相同异常:
- 使用
queryForList:
List<Map<String, Object>> results = jdbcTemplate.queryForList(validationQuery);
- 使用
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
相关产品推荐
相关产品推荐

