在 PySpark 中通过 JDBC 实现 SQL Server

Posted

技术标签:

【中文标题】在 PySpark 中通过 JDBC 实现 SQL Server【英文标题】:SQL Server through JDBC in PySpark 【发布时间】:2017-10-30 13:13:45 【问题描述】:
os.environ.get("PYSPARK_SUBMIT_ARGS", "--master yarn-client --conf spark.yarn.executor.memoryOverhead=6144 \
        --executor-memory 1G –jars  /mssql/jre8/sqljdbc42.jar --driver-class-path  /mssql/jre8/sqljdbc42.jar")

source_df = sqlContext.read.format('jdbc').options(
          url='dbc:sqlserver://xxxx.xxxxx.com',
          database = "mydbname",
          dbtable=mytable,
          user=username,
          password=pwd,
          driver='com.microsoft.jdbc.sqlserver.SQLServerDriver'
          ).load()

我正在尝试使用 Spark 上下文加载 SQL Server 表。

但遇到以下错误。

Py4JJavaError: An error occurred while calling o59.load.
: java.lang.ClassNotFoundException: com.microsoft.sqlserver.jdbc.SQLServerDriver
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)

我在该位置有 jar 文件。那是正确的jar文件吗? 是不是代码有问题。

不知道是什么问题。

Scala 错误

scala> classOf[com.microsoft.sqlserver.jdbc.SQLServerDriver]
<console>:27: error: object sqlserver is not a member of package com.microsoft
              classOf[com.microsoft.sqlserver.jdbc.SQLServerDriver]


scala> classOf[com.microsoft.jdbc.sqlserver.SQLServerDriver]
<console>:27: error: object jdbc is not a member of package com.microsoft
              classOf[com.microsoft.jdbc.sqlserver.SQLServerDriver]

【问题讨论】:

【参考方案1】:

我在 Windows 中安装了 Spark,并在按照此处https://docs.azuredatabricks.net/spark/latest/data-sources/sql-databases.html#python-example 中描述的步骤连接到 SQL Server 时遇到了同样的错误。我像下面这样解决了这个问题-

1) 从这里https://www.microsoft.com/en-us/download/details.aspx?id=11774下载SQL Server JDBC驱动。

2) 解压为“Microsoft JDBC Driver 6.0 for SQL Server”

3) 在“Microsoft JDBC Driver 6.0 for SQL Server”文件夹中找到 JDBC jar 文件(如 sqljdbc42.jar)。

4) 将 jar 文件(如 sqljdbc42.jar)复制到 Spark 主文件夹下的“jars”文件夹中。就我而言,我将其复制并粘贴到“D:\spark-2.3.1-bin-hadoop2.6\jars”

5) 重启pyspark

通过这种方式,我为 Windows 服务器解决了这个问题。

【讨论】:

【参考方案2】:

配置类似于 Spark-Oracle 的配置。 这是我的 Spark-sqlserver 配置:

from pyspark.sql import SparkSession
spark = SparkSession\
    .builder\
    .master('local[*]')\
    .appName('Connection-Test')\
    .config('spark.driver.extraClassPath', '/your/jar/folder/sqljdbc42.jar')\
    .config('spark.executor.extraClassPath', '/your/jar/folder/sqljdbc42.jar')\
    .getOrCreate()


sqlsUrl = 'jdbc:sqlserver://your.sql.server.ip:1433;database=YourSQLDB'

qryStr = """ (
    SELECT *
    FROM yourtable
    ) t """

spark.read.format('jdbc')\
    .option('url',sqlsUrl)\
    .option('driver', 'com.microsoft.sqlserver.jdbc.SQLServerDriver')\
    .option('dbtable', qryStr )\
    .option("user", "yourID") \
    .option("password", "yourPasswd") \
    .load().show()
    设置您下载的 jar 文件的位置 =>“/your/jar/folder/sqljdbc42.jar”。 jar 文件可以从以下位置下载:https://www.microsoft.com/en-us/download/details.aspx?id=54671(*google sqljdbc42.jar 如果链接不起作用) 设置正确的 jdbc url => 'jdbc:sqlserver://your.sql.server.ip:1433;database=YourSQLDB'(如果您有不同的设置,请更改端口号) 设置正确的驱动名称 => .option('driver', 'com.microsoft.sqlserver.jdbc.SQLServerDriver') 享受

【讨论】:

以上是关于在 PySpark 中通过 JDBC 实现 SQL Server的主要内容,如果未能解决你的问题,请参考以下文章

JSP中通过JDBC访问数据库

在 pyspark 中通过检查加载数据框给了我空的数据框

错误 - 在 windows 10/8.1 机器中通过 anaconda 使用 python pyspark

pyspark对Mysql数据库进行读写

Apache Spark JDBC SQL 注入 (pyspark)

在 Shell 脚本中通过 JDBC 连接到 DB2