Java连接Hive踩坑血泪 java.sql.SQLException: Method not supported
-
今天突然接到一个需求:为部署在医院内部系统增加
Hive
连接方式,在一顿操作之后加上JDBC驱动以及hadoop-common依赖<!-- https://mvnrepository.com/artifact/org.apache.hive/hive-jdbc --> <dependency> <groupId>org.apache.hive</groupId> <artifactId>hive-jdbc</artifactId> <version>1.1.1</version> <exclusions> <exclusion> <groupId>org.eclipse.jetty.aggregate</groupId> <artifactId>jetty-all</artifactId> </exclusion> <exclusion> <groupId>org.apache.hive</groupId> <artifactId>hive-shims</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-common</artifactId> <version>2.6.0</version> </dependency> 复制代码
-
然后就在测试环境出了问题:java.sql.SQLException: Method not supported
-
在经过一段时间面向google编程后(下图),觉得可能是
Hive
版本和JDBC版本不兼容,在确定了测试环境版本是2.1.0版本Hive
后立马松了口气,因为医院Hive
版本是1.1.0的,觉得报错也是正常的,在更换了JBDC驱动版本为2.1.0之后连接测试环境Hive
是正常使用的,因此自信满满更新了医院的系统。 -
结果更新了医院系统使用
Hive
还一样的报错:java.sql.SQLException: Method not supported没有多想觉得还是医院版本驱动不兼容,在官网
看到这么1.1.0驱动的时候感觉头都大了,心里觉得Hive
这么垃圾吗?版本驱动兼容都不做。 -
在经过两个小时的摸索,总觉得不对劲,仔细看了报错后发现忽略了最关键的信息
仔细看了代码之后发现获取数据连接是正常,只是在查询测试sql语句的时候报错了,这个报错是HiveStatement.setQueryTimeout报的错误,这个方法是设置查询语句超时时间的
DBUtil.query代码
当看了HiveStatement源码之后就终于破案了
原来hive-jdbc-1.1.0驱动不允许设置查询超时时间,只要去掉查询超时时间的配置,就能正常使用了。从网上查询的解决办法千篇一律都是说版本不兼容,需要更换版本,实在是误导大家,因此在记录问题的同时也给和我遇到同样问题的朋友一点解决思路。
ps
-
hive-jdbc-2.1.0驱动是可以设置查询语句超时时间的,所以在测试环境使用hive-jdbc-2.1.0驱动连接
Hive
是没有问题的。