You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 16:00:59