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直接运行
- 在
build.sbt中添加PostgreSQL驱动依赖,注意依赖范围不要设为Provided:
libraryDependencies += "org.postgresql" % "postgresql" % "42.6.0"
- 刷新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()
- 检查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
相关产品推荐
相关产品推荐

