我正在尝试使用com.microsoft.azure从表中读取内容。下面是代码片段
import org.apache.log4j.{Level, Logger}
import org.apache.spark.sql.SparkSession
import com.microsoft.azure.sqldb.spark.config.Config
import com.microsoft.azure.sqldb.spark.connect._
import com.microsoft.azure.sqldb.spark.query._
import org.apache.spark.sql.functions.to_date
val spark = SparkSession.builder().master("local[*]").appName("DbApp").getOrCreate()
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver")
val config = Config(Map(
"url" -> "jdbc:sqlserver://localhost:1433",
"databaseName" -> "Student",
"dbTable" -> "dbo.MemberDetail",
"authentication" -> "SqlPassword",
"user" -> "test",
"password" -> "****"
))
val df = spark.sqlContext.read.sqlDB(config)
println("Total rows: " + df.count)
然而,我得到下面的错误
Exception in thread "main" java.lang.NoClassDefFoundError: scala/Product$class
at com.microsoft.azure.sqldb.spark.config.SqlDBConfigBuilder.<init>(SqlDBConfigBuilder.scala:31)
at com.microsoft.azure.sqldb.spark.config.Config$.apply(Config.scala:254)
at com.microsoft.azure.sqldb.spark.config.Config$.apply(Config.scala:235)
at DbApp$.main(DbApp.scala:55)
at DbApp.main(DbApp.scala)
mssql jdbc版本:mssql-jdbc-7.2.2.jre8 azure sqldb spark版本:1.0.2
谁能帮我指点一下我做错了什么。?
3条答案
按热度按时间dm7nw8vv1#
此问题是由于com.microsoft.azure.sqldb和com.microsoft.jdbc驱动程序之间的版本(问题本身中提到了版本)冲突造成的,在从下面的链接下载com.microsoft.azure.sqldb及其所有依赖项后,它工作了。
注意:com.microsoft.azure.sqldb在Java8上工作,我降级了java运行时版本。
单击此处查看com.microsoft.azure.sqldb及其所有依赖项
jhdbpxl92#
因为您正在使用azure sqldb spark连接到sql server。
此连接器支持microsoft jdbc driver for sql server中的所有连接属性。在com.microsoft.azure.sqldb.spark.config.config对象中添加连接属性作为字段。
您不需要创建jdbc驱动程序
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver")
再一次。你的感冒应该是这样的:
请参考:
使用连接器将spark连接到sql db
azure sqldbSpark
希望这有帮助。
oymdgrw73#
该类似乎既没有在您的配置中设置,也没有在其他任何地方指定。
Class.forName
只是验证jdbc驱动程序的存在。司机也是microsoft.sqlserver
,这是不同的库。考虑使用以下方法:
这种方法在我的环境中是最稳定的(使用databricks和azuresqldb)。
此处提供相关知识库文章。