【问题标题】:MySql driver not found for Scala program找不到 Scala 程序的 MySql 驱动程序
【发布时间】:2025-12-20 00:05:11
【问题描述】:

我是 Scala 的新手,正在尝试使用 Spark 从 mysql 数据库中读取数据。无论我做什么,我都面临着一个找不到类的异常。我尝试在没有 Spark 的情况下使用 Squeryl、Scalike 等进行连接。总是同样的问题。 这是我试过的一个例子:

logger.info("Write part")

val dataframe_mysql = spark.sqlContext
  .read.format("jdbc")
  .option("url", s"jdbc:mysql://${datamart_server}:3306/vol")
  .option("driver", "com.mysql.jdbc.Driver")
  .option("dbtable", "company")
  .option("user", datamart_user).option("password", datamart_pwd)
  .load()

dataframe_mysql.show()

我尝试将驱动程序类名放在 src/main/resources/application.conf 中:

db.default.driver="com.mysql.jdbc.Driver"

但这没有帮助。我有:

java.sql.SQLException: 没有合适的驱动程序

我还分享了 sbt 文件来展示我如何添加依赖项:

name := "commercial-api-datamart-feed"
version := "0.1"
scalaVersion := "2.11.6"
libraryDependencies += "org.scala-lang.modules" %% "scala-parser-combinators" % "1.1.0"
libraryDependencies += "ch.qos.logback" % "logback-classic" % "1.1.3" % Runtime
libraryDependencies += "com.typesafe.scala-logging" %% "scala-logging" % "3.9.0"
libraryDependencies += "org.apache.spark" %% "spark-core" % "2.3.0"
libraryDependencies += "org.apache.spark" %% "spark-sql" % "2.3.0"
libraryDependencies += "mysql" % "mysql-connector-java" % "5.1.24" % Runtime

Spark 不是强制性的,但我认为它对性能更好。

【问题讨论】:

    标签: mysql scala apache-spark jdbc


    【解决方案1】:

    您必须确保所有执行程序上都存在 mysql 依赖项。在我的环境中,我使用 maven 并在我的 pom.xml 中指定这样的依赖项:

    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>5.1.42</version>
    </dependency>
    

    然后我确保将此依赖项捆绑在我的应用程序 jar 中(使用 maven shade 插件),这样我就不必将 jar 放在所有执行程序上。

    无论您使用spark 还是不使用jdbc 访问mysql,您都需要确保mysql-connector 在您的classpath 上可用,无论您从何处执行mysql 查询。

    【讨论】:

    • 感谢@Travis 的评论。很抱歉我忘记包含我的 sbt 文件。我正在更新帖子。
    【解决方案2】:

    你是如何运行这段代码的?您需要将 MySQL JAR 作为--jars 传递;如果启动 spark-shellspark-submit,则类似于 --jars /path/to/mysql.jar

    如果您更喜欢运行单个 JAR,则需要确保 MySQL JAR 作为您的 uber JAR 的一部分嵌入。我从未使用过 SBT,但您需要检查创建的最终 JAR 中是否包含 MySQL 类——如果没有,请使用相关的 SBT 标志来实现。

    【讨论】:

    • 你是对的。我正在使用 spark-submit,并且 jar 不包含 mysql 驱动程序。 (但是它不包括其他依赖项,那么为什么只包含 mysql 驱动程序?)。所以现在当我添加你建议的参数时,它就可以工作了。我仍然有使用 addSbtPlugin 的问题(为 scala 2.11 找到正确的版本),但我认为我应该把它作为另一个问题。谢谢!
    • @IoriYagami AFAIK,它适用于其他 JAR(spark-sqlspark-core)的原因是它们在生成执行程序/驱动程序时已经是类路径的一部分,因为它们是 Spark 的一部分安装。对于您的应用程序使用的任何“非 Spark”JAR,您应该会看到相同的行为。如果不是,那将是非常令人惊讶的。