Spark JDBC: Spark .read语法错误



我试图通过使用

读取表中的最大id
_select_sql = f"(SELECT MAX(id) FROM {tablename})"
highest_id = spark.read.jdbc(url, table=_select_sql, properties=properties)

执行后,我得到:

com.microsoft.sqlserver.jdbc.SQLServerException: Incorrect syntax near the keyword 'WHERE'

当我尝试使用highest_id = spark.read.jdbc(url, table=tablename, properties=properties)读取所有数据时,一切都很好。

你知道哪里可能出错吗?

编辑:

改成

_select_sql = f"(SELECT MAX(id) FROM {tablename}"

我得到了:

com.microsoft.sqlserver.jdbc.SQLServerException: Incorrect syntax near '0'.

您正在使用query作为表名-这将不起作用。您需要使用query选项来代替(参见文档):

highest_id = spark.read.format("jdbc") 
.option("url", jdbcUrl) 
.option("query", f"SELECT MAX(id) FROM {tablename}") 
.load() 

Spark内部创建如下SQL语句

SELECT * FROM <table>

所以,如果你想要一个语句作为表参数,它必须看起来像这样(只是给内联视图添加一个名称):

_select_sql = f"(SELECT MAX(id) FROM {tablename}) tab"

和火花创建的SQL将看起来像这样,并完成工作:

SELECT * FROM (SELECT MAX(id) FROM mytable) tab

我使用

解决了这个问题
_select_sql = f"(SELECT TOP(1) id FROM {tablename} ORDER BY id DESC)"

无论如何感谢Alex Ott,它只在他给予的方式下才有效。我真的不知道为什么,因为一些来源告诉这应该以类似的方式工作:

df = spark.read.jdbc(url = url, table = query, properties = properties)

最新更新