如何从spark(databricks)jdbcpython在sqlserver上运行存储过程?

4c8rllxm  于 2021-07-14  发布在  Spark
关注(0)|答案(1)|浏览(671)

我有一个在sql server中使用下面的scala代码在databricks中执行存储过程的工作示例。但我想知道是否有可能在pythonjdbc中也这样做?我做不到。请参见以下示例:
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开头的任何东西似乎都不起作用。。。
如果不可能,有人能详细解释一下为什么在databricks中可以用scala而不是python完成吗?我想让它与python一起工作,因为其余的笔记本已经是python了。。
谢谢您。
/巴奇

4zcjmb1e

4zcjmb1e1#

是的,您可能只需要访问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()

相关问题