我正在运行下面的代码,通过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()
2条答案
按热度按时间rekjcdws1#
请将查询替换为以下语句并重试:
或
还要尝试将模式名放在过程名的前面
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模块,如pyjdbc或JayDeBeApi或MySQL-python或cx-Oracle。这是非Spark代码。考虑运行一些GRANT语句或调用一些存储过程等。
只有当您希望将
spark.read.jdbc()
用作数据源以高效读取(上限/下限/numPartitions),创建Dataframes并使用该数据进行“spark things”时,才希望使用spark.read.jdbc()
到read from RDB。还请注意,如果它是相关的,但检查:Spark SQL version of EXEC()