我正在尝试在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类没有正确添加。
答案 0 :(得分:2)
您不需要提供类名来使用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
。
答案 1 :(得分:0)
您的mysql驱动程序类 com.mysql.jdbc.Driver 它在运行时的类路径中不存在。如果你使用 spark-submit 运行你的火花工作,那么你至少有两个选择:
答案 2 :(得分:0)
spark-submit \
--class com.mypack.MyClass \
--master yarn --deploy-mode cluster \
--conf spark.executor.extraClassPath=$POSTGRESQL_JAR_PATH:$MYSQL_JAR_PATH \
--conf spark.driver.extraClassPath=$POSTGRESQL_JAR_PATH:$MYSQL_JAR_PATH \
其中,$POSTGRESQL_JAR_PATH
和$MYSQL_JAR_PATH
应使用jar文件的hdfs路径设置。
spark.executor.extraClassPath
如果您在群集模式下运行它。
spark.driver.extraClassPath
如果您在本地运行它。
我建议将两个选项设置为更安全的一面。
答案 3 :(得分:0)
您应该在提交火花作业时传递驱动程序jar,如下所示:
1) spark-submit --jars mysql-connector-java-5.1.39.jar以及传递时的其余参数
2)如果你只想尝试本地使用shell spark-shell --jars mysql-connector-java-5.1.39.jar
将驱动程序更新为您已有的驱动程序,并提供该
的绝对路径