mysql - Spark 无法从 SBT 找到 JDBC 驱动程序

标签 mysql scala apache-spark jdbc

我正在尝试在 Scala Spark 应用程序中使用 JDBC,并且正在使用 sbt 进行编译。但是,当我添加行 Class.forName("com.mysql.jdbc.Driver") 时,它会抛出 ClassNotFoundException。

我的 sbt 文件是这样的:

name := "SparkApp"
version := "1.0"
scalaVersion := "2.11.8"
libraryDependencies += "org.apache.spark" %% "spark-core" % "2.1.0"
libraryDependencies += "org.apache.spark" %% "spark-sql" % "2.1.0"
libraryDependencies += "com.databricks" %% "spark-csv" % "1.5.0"
libraryDependencies += "org.apache.spark" %% "spark-mllib" % "2.1.0"
libraryDependencies += "mysql" % "mysql-connector-java" % "6.0.5"

据我所知,最后一行是我添加 JDBC 驱动程序所需的全部内容,但它似乎不起作用。我也尝试过Class.forName("com.mysql.jdbc.Driver").newInstance()但它有相同的结果,所以我认为问题出在 jdbc 类根本没有正确添加。

最佳答案

您无需提供类名即可使用 JDBC 加载数据帧。继Spark SQL documentation ,您只需提供 "jdbc" 作为数据源格式(并且确实将连接器添加为依赖项)并设置正确的选项:

val host: String = ???
val port: Int = ???
val database: String = ???
val table: String = ???
val user: String = ???
val password: String = ???

val options = Map(
      "url" -> s"jdbc:mysql://$host:$port/$database?zeroDateTimeBehavior=convertToNull",
      "dbtable" -> table,
      "user" -> user,
      "password" -> password)

val df = spark.read.format("jdbc").options(options).load()

当您将应用程序提交到 Spark 时,您必须将 MySQL 连接器包含到最终的 jar 文件中,或者告诉 spark-submit 将包作为依赖项获取:

spark-submit --packages mysql:mysql-connector-java:6.0.5 ...

此标志也适用于 spark-shellpyspark

关于mysql - Spark 无法从 SBT 找到 JDBC 驱动程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42535807/

相关文章:

java - 无法执行多个 Spark 作业 "Initial job has not accepted any resources"

php - 最初从 MySQL 数据库中获取一个数组,并在每次用户看到它时取消设置它的一个元素是不是很糟糕?

sql - 使用 MySQL,如何在另一个表中不存在该值的情况下插入到一个表中?

scala - 声明返回枚举的泛型方法

scala - 升级了spark版本,在spark作业中遇到java.lang.NoSuchMethodError : scala. Product.$init$(Lscala/Product;)V

apache-spark - 如何获取 DataFrame 的字符串表示形式(如 Dataset.show)?

mysql - 导入转储文件而不会中断服务

每个星期天的mysql事件安排

Scala Monocle - 在 E 中找不到方法 ID

scala - 在 1.6 中工作的 Spark ml 管道在 2.0 中不起作用。类型不匹配错误