如何使用Spark SQL查询过滤中文列名的数据?
问题原因解析
- 直接写中文列名报错:Spark SQL的语法解析器默认对非ASCII字符的标识符(如中文列名)不做特殊识别,未包裹的中文会被解析为非法语法字符,直接触发解析异常。
- 加单引号返回空结果:SQL中单引号包裹的内容会被识别为字符串常量,你写的
'名稱'=='jeremy'等价于拿固定字符串"名稱"和"jeremy"做等值判断,结果永远为假,所以返回空数据集。
解决方案
方案1:使用反引号包裹中文列名(推荐,无需修改配置)
反引号`是SQL标准中用来包裹特殊标识符的符号,Spark SQL原生支持,直接把中文列名用反引号包裹即可正常识别:
spark.sql("select * from t1 where `名稱` == 'jeremy'").show()
运行后会正常返回匹配的结果:
+------+----+-------+ | 名稱|年齡|address| +------+----+-------+ |jeremy| 33| Taipei| +------+----+-------+
方案2:统一规范列名(长期最优)
如果业务允许,建议建表时将所有列名统一调整为英文+下划线的命名规范,从根源上避免多引擎兼容、编码、解析等各类潜在问题。
内容的提问来源于stack exchange,提问作者Ramdani
相关产品推荐
相关产品推荐

