Java连接Hive踩坑血泪

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

    image-20210603143916246

  • 在经过一段时间面向google编程后(下图),觉得可能是Hive版本和JDBC版本不兼容,在确定了测试环境版本是2.1.0版本Hive后立马松了口气,因为医院Hive版本是1.1.0的,觉得报错也是正常的,在更换了JBDC驱动版本为2.1.0之后连接测试环境Hive是正常使用的,因此自信满满更新了医院的系统。 image-20210603141307159

  • 结果更新了医院系统使用Hive还一样的报错:java.sql.SQLException: Method not supported

    没有多想觉得还是医院版本驱动不兼容,在官网
    看到这么1.1.0驱动的时候感觉头都大了,心里觉得Hive这么垃圾吗?版本驱动兼容都不做。

    image-20210603142811297

  • 在经过两个小时的摸索,总觉得不对劲,仔细看了报错后发现忽略了最关键的信息

    image-20210603144213959

    仔细看了代码之后发现获取数据连接是正常,只是在查询测试sql语句的时候报错了,这个报错是HiveStatement.setQueryTimeout报的错误,这个方法是设置查询语句超时时间的

    image-20210603144610066

    DBUtil.query代码

    image-20210603145218908

    当看了HiveStatement源码之后就终于破案了

    image-20210603145059723

    原来hive-jdbc-1.1.0驱动不允许设置查询超时时间,只要去掉查询超时时间的配置,就能正常使用了。从网上查询的解决办法千篇一律都是说版本不兼容,需要更换版本,实在是误导大家,因此在记录问题的同时也给和我遇到同样问题的朋友一点解决思路。

ps

  • hive-jdbc-2.1.0驱动是可以设置查询语句超时时间的,所以在测试环境使用hive-jdbc-2.1.0驱动连接Hive是没有问题的。

    image-20210603150811158

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享