我正在尝试在 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-shell
或 pyspark
。
关于mysql - Spark 无法从 SBT 找到 JDBC 驱动程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42535807/