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
相关产品推荐
相关产品推荐

