pyspark 我正在运行下面的代码,通过Spark JDBC在python中运行SQL过程

smdncfj3  于 2023-04-19  发布在  Spark
关注(0)|答案(2)|浏览(149)

我正在运行下面的代码,通过Spark JDBC在python中运行SQL过程,并获得错误。
第行分析错误:1,柱:15:“EXEC”附近的语法不正确。
意思是执行EXEC [jarvis].[uspGetCreditOutputLatestTimeStampForGamification]时出现一些语法错误。能否请您帮助我使用正确的代码通过pyspark中的spark jdbc调用sql过程?

我尝试了不同的sytax,但没有工作,我期待正确的代码调用SQL存储过程通过Spark JDBC。

from pyspark.sql import SparkSession

# create a SparkSession
spark = SparkSession.builder.appName("Run SQL Procedure using JDBC").getOrCreate()

# set the JDBC connection properties
jdbcHostname = "--"
jdbcPort = "--"
jdbcDatabase = "--"
jdbcUsername = "--"
jdbcPassword = "--"

jdbcUrl = "jdbc:sqlserver://{0}:{1};database={2}".format(jdbcHostname, jdbcPort, jdbcDatabase)
connectionProperties = {
  "user": jdbcUsername,
  "password": jdbcPassword,
  "driver": "com.microsoft.sqlserver.jdbc.SQLServerDriver"
}

# specify the name of the SQL procedure and its parameters
procedureName = "[jarvis].[uspGetCreditOutputLatestTimeStampForGamification]"
param1 = "DeltaLoad"
#param2 = "<param2>"
#EXEC  @resultVal = [dbo].[uspGetEmployeeRosterAssignmentToTERA]

# build the SQL query string
query = "EXEC {0} @param1='{1}' ".format(procedureName, param1)
print(query)

# read the result of the procedure into a DataFrame
df = spark.read.jdbc(url=jdbcUrl, table=query, properties=connectionProperties)

# show the DataFrame
df.show()
rekjcdws

rekjcdws1#

请将查询替换为以下语句并重试:

query = f"EXEC {procedureName} @param1='{param1}'"

query = f"EXEC [{procedureName}] @param1='{param1}'"

还要尝试将模式名放在过程名的前面

query = f"EXEC [schema_name].[{procedureName}] @param1='{param1}'"
btqmn9zl

btqmn9zl2#

spark将接受Spark的SQL语法中的查询。Spark解析该SQL并在将其发送到实际DB之前对其进行翻译。因此在这种情况下,query的(spark.read.jdbc(url=jdbcUrl, table=query, ...)内容需要使用Spark SQL语法。并且Spark SQL没有EXEC命令。
如果你只是想通过JDBC连接在一些随机的数据库上执行一些随机的SQL(在一些特定于数据库的SQL语法中),使用一个python jdbc模块,如pyjdbcJayDeBeApiMySQL-pythoncx-Oracle。这是非Spark代码。考虑运行一些GRANT语句或调用一些存储过程等。
只有当您希望将spark.read.jdbc()用作数据源以高效读取(上限/下限/numPartitions),创建Dataframes并使用该数据进行“spark things”时,才希望使用spark.read.jdbc()read from RDB
还请注意,如果它是相关的,但检查:Spark SQL version of EXEC()

相关问题