使用Spark JDBC读取H2表时触发NullPointerException问题排查
问题分析与解决:Spark JDBC读取H2数据库时出现NullPointerException
核心错误原因
你全程操作的是H2数据库,但错误地使用了PostgreSQL的JDBC驱动,这是导致连接创建失败(conn为null)进而抛出NullPointerException的根本原因。
具体错误点
- 初始化JDBC连接时,错误加载PostgreSQL驱动:
Class.forName("org.postgresql.Driver"),但实际连接的是H2数据库 - Spark读取JDBC时,Properties中仍设置PostgreSQL驱动:
props.setProperty("driver", "org.postgresql.Driver") - 额外问题:用
executeQuery执行DDL(建表)和DML(插入)语句,这类操作应使用executeUpdate,executeQuery仅用于返回ResultSet的查询语句
修正后的代码
1. 创建表与插入数据的正确代码
val url = "jdbc:h2:~/test;USER=sa;PASSWORD=password" val user = "sa" val password = "password" // 加载H2官方JDBC驱动 Class.forName("org.h2.Driver") val connection = DriverManager.getConnection(url, user, password) val statement = connection.createStatement() // 用executeUpdate执行DDL/DML操作 statement.executeUpdate("create table storage ( id integer, path text, name varchar);") statement.executeUpdate("insert into storage values (1, 'test_path', 'test_name');") // 手动关闭资源 statement.close() connection.close()
2. Spark读取H2表的正确代码
val spark = SparkSession.builder().master("local[*]").appName("test-spark-jdbc").getOrCreate() val props = new Properties() // 设置H2的驱动类 props.setProperty("driver", "org.h2.Driver") props.setProperty("user", "sa") props.setProperty("password", "password") val storageDf = spark.read.jdbc(url, "storage", props) // 验证读取结果 storageDf.show() spark.stop()
额外注意事项
确保项目依赖中包含H2数据库的JDBC驱动,以Maven为例:
<dependency> <groupId>com.h2database</groupId> <artifactId>h2</artifactId> <version>2.2.224</version> <!-- 选择适配的版本 --> <scope>test</scope> <!-- 测试环境使用 --> </dependency>
内容的提问来源于stack exchange,提问作者Jelly
相关产品推荐
相关产品推荐

