Synapse Spark选择含空格列名触发列名无效报错如何解决?
问题根本原因
该报错是Azure Synapse Spark内置synapsesql连接器的转义逻辑缺陷导致的:链式调用select时,连接器会将传入的列名直接拼接为下发到Synapse SQL池的查询语句,过程中错误剥离了反引号,将空格识别为列名分隔符,因此仅读取到空格前的Country作为列名触发报错。
解决方法1:先全量加载再选列(小表适用)
先全量读取整个表到Spark DataFrame,此时下发到SQL池的查询为SELECT *,不存在列名转义问题,加载完成后在Spark侧执行列选择,使用常规反引号转义即可正常识别带空格的列名:
%%spark // 全量读取目标表 val fullDf = spark.read.synapsesql("<Pool>.<schema>.<table>") // Spark侧选择列,反引号包裹带空格的列名即可 val resultDf = fullDf.select("`Country Code`", "TYPE", "Year").limit(100) resultDf.show()
解决方法2:自定义SQL查询预筛选(大表适用)
如果目标表数据量较大,全量加载会浪费资源,可以使用JDBC连接器指定自定义查询,直接在Synapse SQL侧使用原生支持的方括号[]转义带空格的列名完成筛选,再将结果加载到Spark:
%%spark val resultDf = spark.read .format("com.microsoft.sqlserver.jdbc.spark") .option("url", "jdbc:sqlserver://<你的Synapse工作区名>.sql.azuresynapse.net:1433;database=<数据库名>;encrypt=true;trustServerCertificate=false;hostNameInCertificate=*.sql.azuresynapse.net;loginTimeout=30;") .option("dbtable", "(SELECT [Country Code], TYPE, Year FROM <schema名>.<表名>) AS query_result") .option("user", "<SQL账号>") .option("password", "<SQL密码>") .load() .limit(100) resultDf.show()
内容的提问来源于stack exchange,提问作者Peter Trcka
相关产品推荐
相关产品推荐

