使用com.microsoft.azure从sql server读取

brjng4g3  于 2021-05-27  发布在  Spark
关注(0)|答案(3)|浏览(738)

我正在尝试使用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
谁能帮我指点一下我做错了什么。?

dm7nw8vv

dm7nw8vv1#

此问题是由于com.microsoft.azure.sqldb和com.microsoft.jdbc驱动程序之间的版本(问题本身中提到了版本)冲突造成的,在从下面的链接下载com.microsoft.azure.sqldb及其所有依赖项后,它工作了。
注意:com.microsoft.azure.sqldb在Java8上工作,我降级了java运行时版本。
单击此处查看com.microsoft.azure.sqldb及其所有依赖项

jhdbpxl9

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") 再一次。
你的感冒应该是这样的:

import com.microsoft.azure.sqldb.spark.config.Config
import com.microsoft.azure.sqldb.spark.connect._

val config = Config(Map(
  "url"            -> "locaohost",
  "databaseName"   -> "MyDatabase",
  "dbTable"        -> "dbo.Clients",
  "user"           -> "username",
  "password"       -> "*********",
  "connectTimeout" -> "5", //seconds
  "queryTimeout"   -> "5"  //seconds
))

val collection = sqlContext.read.sqlDB(config)
collection.show()

请参考:
使用连接器将spark连接到sql db
azure sqldbSpark
希望这有帮助。

oymdgrw7

oymdgrw73#

该类似乎既没有在您的配置中设置,也没有在其他任何地方指定。 Class.forName 只是验证jdbc驱动程序的存在。司机也是 microsoft.sqlserver ,这是不同的库。
考虑使用以下方法:

import com.microsoft.sqlserver.jdbc.SQLServerDriver
import java.util.Properties
val jdbcHostname = "localhost"
val jdbcPort = 1433
val jdbcDatabase = "Student"
val jdbcTable = "dbo.MemberDetail"

val MyDBUrl = s"jdbc:sqlserver://${jdbcHostname}:${jdbcPort};database=${jdbcDatabase}"

val MyDBProperties = new Properties()
MyDBProperties.put("user", "test")
MyDBProperties.put("password", "****")
MyDBProperties.setProperty("Driver", "com.microsoft.sqlserver.jdbc.SQLServerDriver")
val df = spark.read.jdbc(MyDBUrl, jdbcTable, MyDBProperties)

这种方法在我的环境中是最稳定的(使用databricks和azuresqldb)。
此处提供相关知识库文章。

相关问题