在Databricks中用SQLAlchemy或pyodbc连接SQL报错求助
报错原因
- Databricks集群未安装ODBC Driver 17 for SQL Server驱动程序,pyodbc无法找到对应的库文件
- 连接字符串指定的驱动版本(17)与集群已安装的驱动版本不匹配,或集群根本未部署该版本驱动
解决方法
方法1:通过集群初始化脚本安装ODBC Driver 17
Databricks默认使用Ubuntu系统,可通过初始化脚本在集群启动时自动安装驱动:
- 创建如下bash脚本(命名为
install_odbc.sh):
#!/bin/bash # 更新源并安装依赖 apt-get update && apt-get install -y apt-transport-https ca-certificates curl # 添加微软GPG密钥 curl https://packages.microsoft.com/keys/microsoft.asc | apt-key add - # 添加SQL Server ODBC软件源 echo "deb [arch=amd64] https://packages.microsoft.com/ubuntu/$(lsb_release -rs)/prod $(lsb_release -cs) main" > /etc/apt/sources.list.d/mssql-release.list # 安装ODBC Driver 17 apt-get update && ACCEPT_EULA=Y apt-get install -y msodbcsql17
- 将脚本上传至DBFS(比如
dbfs:/scripts/install_odbc.sh) - 进入集群配置页面,在“初始化脚本”中添加该脚本路径,重启集群后驱动即可生效
方法2:修改连接字符串适配已安装的驱动版本
如果集群已安装其他版本的SQL Server ODBC驱动(如ODBC Driver 18),直接修改连接字符串中的驱动名称:
将原代码中的DRIVER={ODBC Driver 17 for SQL Server}替换为DRIVER={ODBC Driver 18 for SQL Server}(或对应已安装的版本号)
方法3:使用Databricks官方JDBC连接器替代
无需依赖ODBC驱动,直接用Spark JDBC连接SQL Server并执行操作:
# 读取SQL Server表 df = spark.read.format("jdbc") \ .option("url", "jdbc:sqlserver://<server>:1433;databaseName=db_test") \ .option("dbtable", "target_table") \ .option("user", "<usrname>") \ .option("password", "pwd") \ .load() # 注册为临时视图后执行DELETE df.createOrReplaceTempView("temp_table") spark.sql("DELETE FROM temp_table WHERE your_condition")
若需直接执行原生DELETE语句,也可通过JDBC连接提交:
from py4j.java_gateway import java_import java_import(spark._jvm, "java.sql.Driver") conn = spark._jvm.java.sql.DriverManager.getConnection( "jdbc:sqlserver://<server>:1433;databaseName=db_test", "<usrname>", "pwd" ) stmt = conn.createStatement() stmt.execute("DELETE FROM target_table WHERE your_condition") stmt.close() conn.close()
额外注意点
原代码中Trusted_Connection=Yes参数在Databricks云环境中无效(无Windows域信任),建议删除该参数,避免认证冲突。
内容的提问来源于stack exchange,提问作者Error 404
相关产品推荐
相关产品推荐

