通过jdbc连接hive报java.sql.SQLException: Method not supported问题

简介: 通过jdbc连接hive报java.sql.SQLException: Method not supported异常或Required field 'client_protocol' is unset异常

今天尝试通过jdbc连接hive,JDBC直接连接是正常成功的,实例:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class SampleHiveJdbc {

    public static void main(String[] args) throws SQLException {
        Connection conn = getConnection();
        
        String sql = "SELECT * FROM log where day='20180828' limit 5";

        PreparedStatement stmt = conn.prepareStatement(sql);

        ResultSet rs = stmt.executeQuery();

        while (rs.next()) {
            System.out.println(rs.getLong(1));
        }
        stmt.close();
        conn.close();
    }

    static Connection getConnection() {
        Connection con = null;
        String JDBC_DB_URL = "jdbc:hive2://192.168.44.141:10001/db";
        try {
            Class.forName("org.apache.hive.jdbc.HiveDriver");
            con = DriverManager.getConnection(JDBC_DB_URL, "hive", "hive");
        } catch (SQLException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        return con;
    }
}

但是在spark程序通过jdbc连接hive,却报错,实例:

import java.util.Properties;

import org.apache.commons.lang3.StringUtils;
import org.apache.spark.SparkConf;
import org.apache.spark.SparkContext;
import org.apache.spark.sql.SQLContext;

public class SparkHiveJdbc {
    public static void main(String[] args) {

        String master = "local[1]";
        String appName = "SparkHiveJdbc";

        SparkConf sparkConf = new SparkConf();

        if (StringUtils.isNoneBlank(master) && master.startsWith("local")) {
            // 如果是本地模式
            sparkConf.setAppName(appName).setMaster(master);
        }

        SparkContext sc = SparkContext.getOrCreate(sparkConf);

        SQLContext sqlContext = new SQLContext(sc);

        /* 1. 读出为RDD */
        String readUrl = "jdbc:hive2://192.168.44.14110001/db";
        String readTable = "log";
        String readUsername = "hive";
        String readPassword = "hive";
        String driverClassName = "org.apache.hive.jdbc.HiveDriver";

        Properties readProperties = new Properties();
        readProperties.setProperty("user", readUsername);
        readProperties.setProperty("password", readPassword);
        readProperties.setProperty("driver", driverClassName);

        sqlContext
                .read().jdbc(readUrl, readTable,
                        new String[] { "day='20180828'" }, readProperties)
                .show();

        sc.stop();

    }
}

在pom.xml中引入的是hive-jdbc-0.13.0.jar包会报

hive jdbc java.sql.SQLException: Method not supported

但是更改为hive-jdbc-2.3.3.jar或hive-jdbc-3.1.0.jar,升级包后,又会报错:

Required field 'client_protocol' is unset

即使本地spark换为2.3,也不行。尝试多次后,发现其实很简单,因为集群hive为CDH5.8版本,所以也使用cloudera的hive-jdbc版本就行,可以去cloudera官网下载 https://www.cloudera.com/downloads/connectors/hive/jdbc/2-6-2.html

使用实例:

import java.util.Properties;

import org.apache.commons.lang3.StringUtils;
import org.apache.spark.SparkConf;
import org.apache.spark.SparkContext;
import org.apache.spark.sql.SQLContext;

public class SparkHiveJdbc {
    public static void main(String[] args) {

        String master = "local[1]";
        String appName = "SparkHiveJdbc";
        SparkConf sparkConf = new SparkConf();

        if (StringUtils.isNoneBlank(master) && master.startsWith("local")) {
            // 如果是本地模式
            sparkConf.setAppName(appName).setMaster(master);
        }

        SparkContext sc = SparkContext.getOrCreate(sparkConf);

        SQLContext sqlContext = new SQLContext(sc);

        /* 1. 读出为RDD */
        String readUrl = "jdbc:hive2://192.168.44.141:10001/db";
        String readTable = "log";
        String readUsername = "hive";
        String readPassword = "hive";
        String driverClassName = "com.cloudera.hive.jdbc41.HS2Driver";

        Properties readProperties = new Properties();
        readProperties.setProperty("user", readUsername);
        readProperties.setProperty("password", readPassword);
        readProperties.setProperty("driver", driverClassName);

        sqlContext
                .read().jdbc(readUrl, readTable,
                        new String[] { "day='20180801'" }, readProperties)
                .show();

        sc.stop();

    }
}
相关文章
|
19天前
|
存储 Java 关系型数据库
高效连接之道:Java连接池原理与最佳实践
在Java开发中,数据库连接是应用与数据交互的关键环节。频繁创建和关闭连接会消耗大量资源,导致性能瓶颈。为此,Java连接池技术通过复用连接,实现高效、稳定的数据库连接管理。本文通过案例分析,深入探讨Java连接池的原理与最佳实践,包括连接池的基本操作、配置和使用方法,以及在电商应用中的具体应用示例。
37 5
|
13天前
|
SQL Java 数据库连接
[SQL]SQL注入与SQL执行过程(基于JDBC)
本文介绍了SQL注入的概念及其危害,通过示例说明了恶意输入如何导致SQL语句异常执行。同时,详细解释了SQL语句的执行过程,并提出了使用PreparedStatement来防止SQL注入的方法。
37 1
|
16天前
|
SQL Java 数据库连接
在Java应用中,数据库访问常成为性能瓶颈。连接池技术通过预建立并复用数据库连接,有效减少连接开销,提升访问效率
在Java应用中,数据库访问常成为性能瓶颈。连接池技术通过预建立并复用数据库连接,有效减少连接开销,提升访问效率。本文介绍了连接池的工作原理、优势及实现方法,并提供了HikariCP的示例代码。
30 3
|
16天前
|
Java 数据库连接 数据库
深入探讨Java连接池技术如何通过复用数据库连接、减少连接建立和断开的开销,从而显著提升系统性能
在Java应用开发中,数据库操作常成为性能瓶颈。本文通过问题解答形式,深入探讨Java连接池技术如何通过复用数据库连接、减少连接建立和断开的开销,从而显著提升系统性能。文章介绍了连接池的优势、选择和使用方法,以及优化配置的技巧。
16 1
|
16天前
|
Java 数据库连接 数据库
Java连接池在数据库性能优化中的重要作用。连接池通过预先创建和管理数据库连接,避免了频繁创建和关闭连接的开销
本文深入探讨了Java连接池在数据库性能优化中的重要作用。连接池通过预先创建和管理数据库连接,避免了频繁创建和关闭连接的开销,显著提升了系统的响应速度和吞吐量。文章介绍了连接池的工作原理,并以HikariCP为例,展示了如何在Java应用中使用连接池。通过合理配置和优化,连接池技术能够有效提升应用性能。
32 1
|
1月前
|
Java 关系型数据库 MySQL
如何用java的虚拟线程连接数据库
本文介绍了如何使用Java虚拟线程连接数据库,包括设置JDK版本、创建虚拟线程的方法和使用虚拟线程连接MySQL数据库的示例代码。
44 6
如何用java的虚拟线程连接数据库
|
22天前
|
SQL Java 关系型数据库
java连接mysql查询数据(基础版,无框架)
【10月更文挑战第12天】该示例展示了如何使用Java通过JDBC连接MySQL数据库并查询数据。首先在项目中引入`mysql-connector-java`依赖,然后通过`JdbcUtil`类中的`main`方法实现数据库连接、执行SQL查询及结果处理,最后关闭相关资源。
|
1月前
|
SQL 存储 Java
Java中使用ClickHouseDriver连接和基本操作
通过上述步骤,你可以轻松地在Java应用中集成ClickHouse数据库,执行基本的CRUD操作。需要注意的是,实际开发中应当根据实际情况调整数据库连接配置(如URL中的主机、端口、数据库名等),并根据应用需求选择合适的异常处理策略,确保代码的健壮性和资源的有效管理。此外,对于复杂查询和大批量数据处理,建议充分利用ClickHouse的特性(如分布式处理、列式存储优化等),以进一步提升性能。
72 2
|
1月前
|
Java 关系型数据库 MySQL
数据库的连接用Java
本文介绍了如何使用Java连接MySQL数据库,包括注册JDBC驱动、创建数据库连接URL、设置数据库用户和密码、建立连接以及关闭连接的完整代码示例。
27 0
数据库的连接用Java
|
1月前
|
SQL 分布式计算 Java
大数据-96 Spark 集群 SparkSQL Scala编写SQL操作SparkSQL的数据源:JSON、CSV、JDBC、Hive
大数据-96 Spark 集群 SparkSQL Scala编写SQL操作SparkSQL的数据源:JSON、CSV、JDBC、Hive
34 0