Spark 在显示功能上向 SQL Server 发送 LIMIT

问题描述 投票:0回答:1

我试图使用 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 

我的配置有什么问题吗?有什么解决方法吗?

sql-server apache-spark pyspark databricks
1个回答
0
投票

默认情况下,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()

尝试这些方法,如果您需要更多帮助,请告诉我!

© www.soinside.com 2019 - 2024. All rights reserved.