PySpark使用like运算符报'expected char'错误求助
问题原因及解决办法
可能的原因
- 引号解析冲突:你用三重单引号(
''')包裹SQL语句,虽然语法合法,但Spark SQL解析器处理like 'AB%'时,可能因换行带来的隐性空白字符、或者解析优先级问题,误判单引号未闭合。而rlike基于正则引擎,对字符串字面量的处理逻辑不同,因此避开了这个问题。 - 通配符解析兼容性:Spark SQL对
like运算符的通配符%解析逻辑更严格,若查询语句中存在复制粘贴带入的零宽空格、不可见制表符等隐藏字符,会触发"未终止字符串"错误;而rlike的正则解析器对这类字符容错性更高。
解决办法
- 替换外层引号类型:把外层的三重单引号换成三重双引号,避免内层单引号和外层引号的解析冲突:
df = spark.sql(""" select * from df where column_a not like 'AB%' """) - 转义内层单引号:如果必须用单引号包裹外层语句,给内层的单引号添加转义符:
df = spark.sql(''' select * from df where column_a not like \'AB%\' ''') - 清理语句中的隐藏字符:把SQL语句整理成简洁格式,手动去掉可能存在的不可见字符:
df = spark.sql("select * from df where column_a not like 'AB%'") - 用字符串格式化构建语句:通过
f-string明确分隔SQL逻辑和字符串字面量,降低解析冲突概率:pattern = 'AB%' df = spark.sql(f"select * from df where column_a not like '{pattern}'")
内容的提问来源于stack exchange,提问作者Dozel
相关产品推荐
相关产品推荐

