使用 pyspark 对 SQL Server JDBC 使用 Windows 身份验证

Posted

技术标签:

【中文标题】使用 pyspark 对 SQL Server JDBC 使用 Windows 身份验证【英文标题】:Using windows authentication for SQL Server JDBC with pyspark 【发布时间】:2019-08-22 09:35:30 【问题描述】:

我想问如何使用 Windows 身份验证和 pyspark 库连接 SQL Server?我可以连接 Microsoft SQL Server Management Studio,但当我尝试使用 Spark 用 Python 编写代码时却无法连接。这是我目前尝试的。

from pyspark.sql import SparkSession

spark = SparkSession \
    .builder \
    .appName("Python Spark SQL basic example") \
    .config("spark.driver.extraClassPath","mssql-jdbc-6.4.0.jre8.jar") \
    .getOrCreate()

mssql_df = spark.read.format("jdbc") \
    .option("url", "jdbc:sqlserver://localhost:1433;databaseName=DATABASE-NAME") \
    .option("dbtable", "database-table-name") \
    .option("user", "Windows-Username") \
    .option("password", "Windows-Pass")\
    .option("driver", 'com.mysql.jdbc.Driver').load()

mssql_df.printSchema()
mssql_df.show()

【问题讨论】:

结果是:py4j.protocol.Py4JJavaError: An error occurred while calling o39.load. 【参考方案1】:

如图here你可以设置integratedSecurity=true通过jdbc和Windows身份验证连接SQL Server。

然后 Spark 配置应该如下所示:

mssql_df = spark.read.format("jdbc") \
    .option("url", "jdbc:sqlserver://localhost:1433;databaseName=DATABASE-NAME;integratedSecurity=true") \
    .option("dbtable", "database-table-name") \
    .option("driver", "com.microsoft.sqlserver.jdbc.SQLServerDriver") \
    .load()

更新:

如 cmets 中所述,用户应将 sqljdbc_auth.dll 放在 mssql-jdbc-7.4.1.jre12.jar 所在的同一文件夹中,或者只为两个 jar 设置 spark.driver.extraClassPath,由 : 分隔,如下所示:

.config("spark.driver.extraClassPath","/path.to/mssql-jdbc-6.4.0.jre8.jar:/path/to/sqljdbc_auth.dll")

sqljdbc_auth.dll 是 Microsoft JDBC Driver 6.0 for SQL Server 的一部分,您可以从here 下载它。或者,您可以在系统上安装 JDBC 驱动程序并指定 dll 的存储路径。

【讨论】:

现在我有另一个问题。现在问题出在 SparkSession 上。在 .config("spark.driver.extraClassPath", "mssql-jdbc-7.4.1.jre12.jar") 上。提出问题:FileNotFoundError: [WinError 2] 系统找不到指定的文件,请问如何解决? mssql-jdbc-6.4.0.jre8.jar 在哪里?您应该明确指定此 .jar 的绝对路径 另一种方法是将 mssql-jdbc-6.4.0.jre8.jar 文件移动到 jars 文件夹下,在我的情况下,这是所有 jars 的默认位置,路径是:C:\spark-2.4.3-bin-hadoop2.7\jars 如你所说,我将 jar 文件移动到我的 spark 文件夹中,并且我给出了绝对路径,但我仍然遇到同样的问题。我可以使用另一种配置吗? 好的,那么您在哪里运行 Spark 作业?还有.config("spark.driver.extraClassPath","mssql-jdbc-6.4.0.jre8.jar")这一行现在的样子?

以上是关于使用 pyspark 对 SQL Server JDBC 使用 Windows 身份验证的主要内容,如果未能解决你的问题,请参考以下文章

使用 Pyspark 将 SQL 查询从 DataBricks 发送到 SQL Server [重复]

即使使用 PySpark 存在表,如何写入 Microsoft SQL Server 表

将 pyspark 连接到 SQL Server 时出错

将 sql server jar 添加到 pyspark 的类路径后无法查询 hive

从 sql server 读取数据并在 PySpark 中使用特殊字符传递我的密码

Pyspark:使用 Python 从 Spark 2.4 连接到 MS SQL Server 2017 时没有合适的驱动程序错误