如何解决Spark SQL无法读取名称包含分号的DataFrame列的问题?
问题原因
Spark SQL解析器的预处理逻辑会优先把分号;识别为SQL语句的结束标记,该步骤发生在反引号包裹的标识符解析之前。所以你写的语句会被提前切割为select \nProfit &`,剩余内容被截断,才会触发解析异常。
Pyspark场景下走的是DataFrame API的列名解析逻辑,不需要经过SQL语句预切割步骤,所以可以正常运行。
解决方案
- 方法1(最稳妥):创建视图前重命名特殊列,后续查询无额外兼容问题
df = spark.createDataFrame([[1,2],[2,3]], ["id", "Profit & Gain"]) # 重命名含特殊字符的列后再创建视图 df.withColumnRenamed("Profit & Gain", "profit_gain")\ .createOrReplaceTempView("dex")
后续直接执行普通SQL即可:
select profit_gain from dex
- 方法2:必须保留原列名的场景,用
col()函数传字符串形式的列名绕过SQL预解析逻辑
select col("Profit & Gain") from dex
该方法对Spark 2.4及以上版本均兼容,不需要修改任何配置。
- 方法3:Notebook环境专用方案
如果你是在Databricks、Zeppelin这类支持%sqlmagic的notebook中运行,可以在SQL执行设置中关闭「自动按分号切割语句」的开关,即可直接用反引号包裹列名正常查询。
内容的提问来源于stack exchange,提问作者halfwind22
相关产品推荐
相关产品推荐

