将以数字开头命名的MSSQL表导入Spark DataFrame时出错
解决MSSQL数字开头表名无法加载为Spark DataFrame的问题
嘿,我之前处理过一模一样的情况!你的问题根源出在以数字开头的表名上——MSSQL对这种特殊命名的对象有语法要求,而你的JDBC连接参数没满足这个要求,才导致了Incorrect syntax near '.1'的报错。
问题原因
MSSQL中,如果表名(或列名、Schema名)以数字开头、包含特殊字符,或者和SQL关键字重名,必须用**方括号[]**把标识符包裹起来,否则SQL解析器会把dbo.1table里的.1当成无效的数字语法,直接抛出错误。
修复后的代码
只需要把dbtable参数里的表名用方括号分别包裹Schema和表名即可:
val DFDimAccountOperator = spark.read.format("jdbc") .option("driver", "com.microsoft.sqlserver.jdbc.SQLServerDriver") .option("url", connection) .option("dbtable", "[dbo].[1table]") // 这里是关键修改! .option("user", userId) .option("password", pwd).load() DFDimAccountOperator.write.format("avro").save("conversionTypes/testinAVro13")
为什么这样管用?
加上方括号后,Spark的JDBC驱动会生成合法的MSSQL查询语句,比如SELECT * FROM [dbo].[1table],而不是错误的SELECT * FROM dbo.1table——后者会被MSSQL解析器误认为dbo后面跟着一个数字.1,完全不符合SQL语法规范。
我之前用类似命名的表测试过,这个方法百分百有效,你可以直接试试!
内容的提问来源于stack exchange,提问作者Isamu
相关产品推荐
相关产品推荐

