Spark调用display函数向SQL Server发送LIMIT语句引发异常问题排查
更新: 我的版本和Fred Alisson的版本在全新集群上均可正常运行,问题出在我这边的方言配置上。
Spark查询SQL Server时LIMIT语句报错问题
我尝试用Spark查询SQL Server,但无法展示结果DataFrame,因为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: Incorrect syntax near '10001'.
进一步检查发现,Spark向SQL Server发送了如下查询语句,由于SQL Server不支持LIMIT,该语句执行失败:
SELECT TestColumn FROM dbo.TestTable LIMIT 10001
我的配置是否存在问题?有没有可行的解决办法?
解决办法
显式配置SQL Server方言
Spark未正确识别SQL Server方言时,会生成不兼容的LIMIT语句。可以通过两种方式指定方言:- 代码中临时设置:
spark.sql("SET spark.sql.dialect=sqlserver") - 在Spark配置文件
spark-defaults.conf中全局配置:spark.sql.dialect sqlserver
- 代码中临时设置:
本地截断数据后再展示
如果需要临时展示数据,可先在Spark侧对DataFrame做行数限制,避免将LIMIT推送到SQL Server执行:df.limit(10000).display()检查JDBC驱动版本
确保使用的是官方适配的mssql-jdbc驱动,旧版本可能存在方言识别缺陷,建议升级到最新稳定版。
内容的提问来源于stack exchange,提问作者user3657850
相关产品推荐
相关产品推荐

