Spark 3.3.1使用Dataset过滤中文列名触发ParseException报错求助
解决Spark 3.3.1中中文列名在filter字符串表达式里的解析错误问题
针对你遇到的Spark 3.3.1里使用中文列名人员在filter字符串表达式中触发ParseException的问题,提供几个可行的解决思路:
改用Column API替代字符串表达式
直接使用Spark的Column操作函数,绕开SQL语法解析器的处理,这是最稳妥的方案:import org.apache.spark.sql.functions; dataset.filter(functions.col("人员").equalTo("111"));Scala版本:
import org.apache.spark.sql.functions.col dataset.filter(col("人员") === "111")这种方式Spark会直接识别列名,不会触发SQL语法解析的问题。
检查反引号的格式
确认代码中包裹中文列名的反引号是英文半角的`,而非中文全角的`(输入法切换时容易误输入)。全角反引号会被SQL解析器当成普通字符,导致列名识别失败。尝试用双引号包裹中文列名
在Spark中,双引号默认用于标识列名(3.3.1默认开启ANSI模式),可以尝试用双引号包裹中文列名,注意字符串中的转义:dataset.filter(" ( (\"人员\" = '111') ) ");给中文列名设置英文别名
提前将中文列名重命名为英文,后续操作使用别名:dataset.withColumnRenamed("人员", "person").filter("person = '111'");
补充说明
Spark的SQL字符串表达式解析器在部分版本中对非ASCII标识符的处理存在兼容性问题,3.3.1可能恰好存在这个小缺陷。改用Column API可以完全绕开这个解析环节,是最推荐的解决方案。
内容的提问来源于stack exchange,提问作者xuweijsnj
相关产品推荐
相关产品推荐

