You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spark.SQL()含通配符的查询中Unicode转义字符处理问题

问题根因

你遇到的是两层转义规则叠加导致的匹配失效:

  • 第一层:PySpark中写的SQL字符串首先会经过Python语法解析,反斜杠会被当作转义符处理,每2个反斜杠会被解析为1个反斜杠传递到下层
  • 第二层:Impala SQL执行时,本身对Unicode转义符又要求额外加1个反斜杠做转义
    你用1个反斜杠会被Python直接吞掉,2个反斜杠传到Impala后只剩1个,不符合Impala的转义要求,所以匹配不到结果,返回null。

解决方案

方案1:直接写4个反斜杠满足两层转义要求

Python侧写\\\\u0022,经过Python解析后变成\\u0022传给Impala,正好符合Impala要求的转义格式,修改后的代码如下:

df = spark.sql("""
select distinct key,
      coalesce(get_json_object(col2,'$.value'), case when col2 like '%value\\\\u0022: false%' then 'false' when col2 like '%value\\\\u0022: true%' then 'true' end) as col2flag
from Table
""")

方案2:使用Python原始字符串(更易维护)

给SQL字符串加r前缀声明为原始字符串,Python不会对内部的反斜杠做转义解析,你只需要按Impala要求写2个反斜杠即可:

df = spark.sql(r"""
select distinct key,
      coalesce(get_json_object(col2,'$.value'), case when col2 like '%value\\u0022: false%' then 'false' when col2 like '%value\\u0022: true%' then 'true' end) as col2flag
from Table
""")

方案3:提前处理转义字符(更健壮)

如果不想处理多层转义,可以先把col2中的转义双引号替换为普通双引号,再做JSON解析或匹配,代码兼容性更强:

df = spark.sql(r"""
select distinct key,
      coalesce(get_json_object(regexp_replace(col2, '\\\\u0022', '"'),'$.value'), 
               case when regexp_replace(col2, '\\\\u0022', '"') like '%"value": false%' then 'false' 
                    when regexp_replace(col2, '\\\\u0022', '"') like '%"value": true%' then 'true' end) as col2flag
from Table
""")

内容的提问来源于stack exchange,提问作者BMAN1992

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 17:09:04