PySpark使用split分割字符串时报Unclosed character错误如何解决
报错原因
split函数的第二个参数为正则表达式,[、]是正则的保留字符,直接写],[会被识别为正则语法符号,而非普通匹配字符,因此触发“未闭合字符类”报错,正则中需要对这类特殊字符转义后使用。
Spark SQL的字符串中写正则转义需要用双反斜杠,]和[的正确转义写法为\\]、\\[,对应你需要的分隔符就是\\],\\[。
完整处理代码
你不需要提前区分两类数据格式,用统一的处理逻辑即可得到目标结果:
selectExpr 写法
df = df.selectExpr(""" transform( split(regexp_replace(col, '^\\[+|\\]+$', ''), '\\],\\['), x -> regexp_replace(x, '^["\']|["\']$', '') ) as col """)
PySpark 函数API写法
from pyspark.sql.functions import regexp_replace, split, transform df = df.select( transform( split(regexp_replace("col", r"^\[+|\]+$", ""), r"\],\["), lambda x: regexp_replace(x, r'^["\']|["\']$', "") ).alias("col") )
处理逻辑说明
- 第一步先移除字符串首尾所有的
[、]符号,两类输入处理后分别变为"A"],["B"和"A","B" - 第二步用
\\],\\[作为分隔符拆分:第一类数据拆分后得到["A", "B"],第二类数据不存在匹配的分隔符,拆分后仍为单元素数组["\"A\",\"B\""] - 第三步遍历数组每个元素,移除元素首尾的引号,最终两类数据都会输出
["A", "B"]的标准数组格式。
内容的提问来源于stack exchange,提问作者Zsofia
相关产品推荐
相关产品推荐

