python - 如何从 Spark(Databricks)JDBC python 在 SQL 服务器上运行存储过程?
问题描述
我有一个使用 Databricks 中的以下 Scala 代码在 SQL SERVER 中执行存储过程的工作示例。但我想知道是否可以在 Python JDBC 中做同样的事情?我不能让它工作。请看下面的例子:
SCALA 中的工作代码
import java.sql.DriverManager
import java.sql.Connection
import org.apache.spark.sql.DataFrame
import org.apache.spark.sql.SparkSession
import org.apache.spark.sql.types.{StructType, StructField, StringType,IntegerType};
import java.sql.ResultSet
val username = "xxxxx"
val pass = "xxxxx"
val url = "jdbc:sqlserver://xxx.database.windows.net:1433;databaseName=xxx"
val table = "SalesLT.Temp3"
val query = s"EXEC sp_truncate_table '${table}'"
val conn = DriverManager.getConnection(url, username, pass)
val rs = conn.createStatement.execute(query)
到目前为止的 Python 代码
connector_type_sql_server_driver = "com.microsoft.sqlserver.jdbc.SQLServerDriver"
jdbc_hostname = "xxxx.database.windows.net"
jdbc_database = "xxxx"
jdbc_port = 1433
jdbc_url = f"jdbc:sqlserver://{jdbc_hostname}:{jdbc_port};database={jdbc_database}"
jdbc_spa_user = "xxx"
jdbc_spa_password = "xxx"
query = "EXEC sys.sp_tables"
query2 = "SELECT * FROM sys.tables"
jdbc_db = (spark.read
.format("jdbc")
.option("driver", connector_type_sql_server_driver)
.option("url", jdbc_url)
.option("query", query)
.option("user", jdbc_spa_user)
.option("password", jdbc_spa_password)
.load()
)
python中的query2正在工作,但是以EXEC开头的任何东西似乎都不起作用......
如果不可能,有人可以详细解释为什么它可以在 Scala 中完成,而不是在 Python 中的 databricks 中完成吗?我想让它与 Python 一起工作,因为其余的笔记本已经在 Python 中了。
谢谢你。
/巴奇
解决方案
是的,您可能只需要访问 JDBC 的底层 Java 类,如下所示:
# the first line is the main entry point into JDBC world
driver_manager = spark._sc._gateway.jvm.java.sql.DriverManager
connection = driver_manager.getConnection(mssql_url, mssql_user, mssql_pass)
connection.prepareCall("EXEC sys.sp_tables").execute()
connection.close()
推荐阅读
- python - 尝试将 fit 与 SelectKBest 变量一起使用并不断收到 TypeError
- google-cloud-platform - 来自 Colab 笔记本的 Google 服务帐户的 12 因素身份验证
- c++ - 对标准安全:移动成员?
- java - 上传两个文件和一个对象失败并出现错误 415
- excel - 计数当前行和下一行是否满足条件
- corda - 我如何在 Corda 事务中使用响应者 inputsStatesAndRef?
- python - 从 pyinstaller bundle #2 访问 python 解释器
- python - 使用 matplotlib 和 numpy 查找一组局部最大值的最大值
- python - 从另一个文件调用函数 - Discord bot
- r - echarts4r:e_mark_line 符号和名称