我试图使用 Spark 查询 SQL Server,但无法让它显示结果数据帧,因为 Spark 正在向 SQL Server 发送文字“LIMIT”,从而导致
SQLServerException
。
以下查询运行绝对正常
df = spark.read.format('sqlserver') \
.option('host', sql_server_host) \
.option('port', sql_server_port) \
.option('database', sql_server_database) \
.option('user', sql_server_user) \
.option('password', sql_server_password) \
.option("dbtable", 'dbo.TestTable')
.load()
但是跑步时
df.display() or display(df)
我收到以下错误:
SQLServerException:“10001”附近的语法不正确。
经过进一步检查,我可以看到 Spark 正在向 sql server 发送以下查询,这显然失败了,因为 SQL Server 不支持 LIMIT。
SELECT TestColumn FROM dbo.TestTable LIMIT 10001
我的配置有什么问题吗?有什么解决方法吗?
默认情况下,Spark 使用“LIMIT”(SQL Server 为“TOP”)。 你可以尝试什么:
1 - 使用 JDBC 连接读取
2 - 使用自定义查询指定表
第一个选项的代码示例:
df = spark.read.format('jdbc') \
.option('url', f'jdbc:sqlserver://{sql_server_host}:{sql_server_port};databaseName={sql_server_database}') \
.option('dbtable', 'dbo.TestTable') \
.option('user', sql_server_user) \
.option('password', sql_server_password) \
.option('driver', 'com.microsoft.sqlserver.jdbc.SQLServerDriver') \
.load()
第二个选项的代码示例:
query = "(SELECT * FROM dbo.TestTable) AS TestTable"
df = spark.read.format('jdbc') \
.option('url', f'jdbc:sqlserver://{sql_server_host}:{sql_server_port};databaseName={sql_server_database}') \
.option('query', query) \
.option('user', sql_server_user) \
.option('password', sql_server_password) \
.option('driver', 'com.microsoft.sqlserver.jdbc.SQLServerDriver') \
.load()
尝试这些方法,如果您需要更多帮助,请告诉我!