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

Spark内置连接提供程序连接PostgreSQL报No suitable driver错误

问题描述

参考Spark官方JDBC数据源文档尝试连接PostgreSQL数据库,文档说明Spark已为以下数据库提供内置连接提供程序:

  • DB2
  • MariaDB
  • MS Sql
  • Oracle
  • PostgreSQL

编写如下Scala代码读取PostgreSQL数据:

val spark = SparkSession.builder().appName("get-from-postgres").master("local[*]")
      .getOrCreate()
val jdbcDF = spark.read
  .format("jdbc")
  .option("url", url)
  .option("dbtable", table)
  .option("user", username)
  .option("password", password)
  .load()
jdbcDF.show(10)

应用运行时持续抛出错误,完整错误栈如下:

[error] java.sql.SQLException: No suitable driver
[error]         at java.sql/java.sql.DriverManager.getDriver(DriverManager.java:298)
[error]         at org.apache.spark.sql.execution.datasources.jdbc.JDBCOptions.$anonfun$driverClass$2(JDBCOptions.scala:107)
[error]         at scala.Option.getOrElse(Option.scala:201)
[error]         at org.apache.spark.sql.execution.datasources.jdbc.JDBCOptions.<init>(JDBCOptions.scala:107)
[error]         at org.apache.spark.sql.execution.datasources.jdbc.JDBCOptions.<init>(JDBCOptions.scala:39)
[error]         at org.apache.spark.sql.execution.datasources.jdbc.JdbcRelationProvider.createRelation(JdbcRelationProvider.scala:34)
[error]         at org.apache.spark.sql.execution.datasources.DataSource.resolveRelation(DataSource.scala:350)
[error]         at org.apache.spark.sql.DataFrameReader.loadV1Source(DataFrameReader.scala:228)
[error]         at org.apache.spark.sql.DataFrameReader.$anonfun$load$2(DataFrameReader.scala:210)
[error]         at scala.Option.getOrElse(Option.scala:201)
[error]         at org.apache.spark.sql.DataFrameReader.load(DataFrameReader.scala:210)
[error]         at org.apache.spark.sql.DataFrameReader.load(DataFrameReader.scala:171)
[error]         at udw.uni.vn.loader.TESTLoader$.delayedEndpoint$udw$uni$vn$loader$TESTLoader$1(TESTLoader.scala:51)
[error]         at udw.uni.vn.loader.TESTLoader$delayedInit$body.apply(TESTLoader.scala:12)
[error]         at scala.Function0.apply$mcV$sp(Function0.scala:39)
[error]         at scala.Function0.apply$mcV$sp$(Function0.scala:39)
[error]         at scala.runtime.AbstractFunction0.apply$mcV$sp(AbstractFunction0.scala:17)
[error]         at scala.App.$anonfun$main$1(App.scala:76)
[error]         at scala.App.$anonfun$main$1$adapted(App.scala:76)
[error]         at scala.collection.IterableOnceOps.foreach(IterableOnce.scala:563)
[error]         at scala.collection.IterableOnceOps.foreach$(IterableOnce.scala:561)
[error]         at scala.collection.AbstractIterable.foreach(Iterable.scala:926)
[error]         at scala.App.main(App.scala:76)
[error]         at scala.App.main$(App.scala:74)
[error]         at udw.uni.vn.loader.TESTLoader$.main(TESTLoader.scala:12)
[error]         at udw.uni.vn.loader.TESTLoader.main(TESTLoader.scala)
[error]         at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
[error]         at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
[error]         at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
[error]         at java.base/java.lang.reflect.Method.invoke(Method.java:566)
[error] stack trace is suppressed; run last Compile / run for the full output
[error] (Compile / run) java.sql.SQLException: No suitable driver
[error] Total time: 15 s, completed Jun 27, 2022, 4:49:01 PM
故障原因

Spark提到的内置连接提供程序,仅内置了对应数据库的JDBC驱动类名自动识别逻辑,不会自带PostgreSQL的JDBC驱动jar包。No suitable driver报错的核心原因是运行环境中缺少PostgreSQL JDBC驱动,或驱动未被正确加载,少数情况是JDBC URL格式写错导致驱动无法匹配。

解决方法

根据实际运行场景选择对应方案:

本地sbt直接运行

  1. 在build.sbt中添加PostgreSQL驱动依赖,注意依赖范围不要设为Provided:
libraryDependencies += "org.postgresql" % "postgresql" % "42.6.0"
  1. 刷新sbt拉取依赖后,如果仍报错,在JDBC读取参数中显式指定驱动类名:
val jdbcDF = spark.read
  .format("jdbc")
  .option("url", url)
  .option("dbtable", table)
  .option("user", username)
  .option("password", password)
  .option("driver", "org.postgresql.Driver")
  .load()
  1. 检查JDBC URL格式,PostgreSQL标准URL格式为jdbc:postgresql://<数据库地址>:<端口,默认5432>/<库名>,前缀写错也会触发相同报错。

提交任务到Spark集群运行

两种方式二选一:

  • 提交任务时通过--jars参数指定本地PostgreSQL驱动包路径:
spark-submit --class 你的主类全限定名 --jars /本地路径/postgresql-42.6.0.jar 你的项目jar包.jar
  • 直接将PostgreSQL驱动jar包放到Spark安装目录的jars文件夹下,所有提交的任务都能自动加载到驱动。

内容的提问来源于stack exchange,提问作者MasterLuV

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 09:39:17