Databricks中Spark SQL用JDBC建视图遇SQL Server登录失败
Databricks中Spark SQL JDBC创建视图登录失败问题排查
问题场景
在Databricks环境下,通过PySpark代码使用JDBC连接SQL Server并创建临时视图可正常运行,但改用Spark SQL语句创建视图时,抛出com.microsoft.sqlserver.jdbc.SQLServerException: Login failed for user错误,且两者使用的JDBC URL、用户凭证等信息完全一致。
正常运行的PySpark代码
jdbcUrl = "jdbc:sqlserver://{0}:{1};database={2}".format(jdbcHostname, jdbcPort, jdbcDatabase) connectionProperties = { "user" : jdbcUsername, "password" : jdbcPassword, "driver" : "com.microsoft.sqlserver.jdbc.SQLServerDriver" } table_name = '<my_table>' pushdown_query = f"(select * from {table_name}) AS tmp" df = spark.read.jdbc(url=jdbcUrl, table=pushdown_query, properties=connectionProperties) df.createOrReplaceTempView('tmp')
报错的Spark SQL代码
CREATE OR REPLACE VIEW tmp USING JDBC OPTIONS ( url "<jdbc_url>", dbtable "(select * from <my_table>) AS tmp", user '<user>', password '<password>', driver "com.microsoft.sqlserver.jdbc.SQLServerDriver" )
问题原因
核心问题在于Spark SQL的OPTIONS参数中,user和password使用了单引号,而其他参数使用双引号,这种引号不一致会导致JDBC驱动无法正确解析用户凭证,最终触发登录失败。
Spark SQL的OPTIONS语法中,字符串参数的引号需要保持统一(推荐使用双引号),部分JDBC驱动对单引号包裹的凭证参数解析存在兼容性问题,导致凭证没有正确传递到SQL Server。
解决方案
将user和password的单引号替换为双引号,与其他参数格式保持一致:
CREATE OR REPLACE VIEW tmp USING JDBC OPTIONS ( url "<jdbc_url>", dbtable "(select * from <my_table>) AS tmp", user "<user>", password "<password>", driver "com.microsoft.sqlserver.jdbc.SQLServerDriver" )
额外排查点
- 确认
<jdbc_url>的格式与PySpark生成的完全一致,例如是否包含database参数,无多余空格或转义字符; - 验证Databricks集群已安装对应版本的SQL Server JDBC驱动(PySpark可正常运行则驱动大概率无问题)。
内容的提问来源于stack exchange,提问作者Minura Punchihewa
相关产品推荐
相关产品推荐

