0

我正在尝试使用 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

谁能指导我我做错了什么。?

4

3 回答 3

0

该类似乎没有在您的配置中设置,也没有在其他任何地方指定。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 和 Azure SQL DB)。

相关知识库文章可在此处获得。

于 2020-05-19T23:32:46.367 回答
0

由于您使用 azure-sqldb-spark 连接到 SQL 服务器。

此连接器支持Microsoft JDBC Driver for SQL Server中的所有连接属性。将连接属性添加为 com.microsoft.azure.sqldb.spark.config.Config 对象中的字段。

您不需要Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver")再次创建 jdbc 驱动程序。

你的感冒应该是这样的:

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()

请参考:

  1. 使用连接器将 Spark 连接到 SQL DB
  2. 天蓝色 sqldb-spark

希望这可以帮助。

于 2020-05-20T05:39:35.103 回答
0

此问题是由于 com.microsoft.azure.sqldb 和 com.microsoft.jdbc 驱动程序之间的版本(问题本身中提到的版本)冲突,从下面的链接下载 com.microsoft.azure.sqldb 及其所有依赖项后它工作.

注意:com.microsoft.azure.sqldb 适用于 Java 8,我降级了我的 java 运行时版本。

单击此处以访问具有所有依赖项的 com.microsoft.azure.sqldb

于 2020-05-23T01:21:08.503 回答