PySpark SQL中regexp_replace替换竖线符号异常问题求助
解决PySpark SQL中regexp_replace替换竖线符号的问题
问题原因
你当前的写法里,Python会把字符串中的\|解析成单个|传递给Spark SQL。而在正则表达式中,|是逻辑或的元字符,单独的|会匹配空字符串,所以会在每个字符前后都插入>,导致结果混乱。
解决方案
1. 使用双反斜杠转义竖线
在Python字符串中,要让Spark SQL拿到真正的\|,需要用双反斜杠\\|——第一个反斜杠是Python的转义符,第二个才是传递给正则的转义符:
job_ctx.spark.sql('''select regexp_replace(COALESCE("Today | is | good | day", ''),'\\|','>') as column''')
2. 使用Python原始字符串(推荐)
在SQL字符串前加r,让Python不解析转义字符,直接把\|传递给Spark SQL,写法更简洁:
job_ctx.spark.sql(r'''select regexp_replace(COALESCE("Today | is | good | day", ''),'\|','>') as column''')
3. 使用translate函数替代(更高效)
如果只是简单的单字符替换,完全不需要正则功能,用translate函数更高效,还不用处理正则元字符的问题:
job_ctx.spark.sql('''select translate(COALESCE("Today | is | good | day", ''), '|', '>') as column''')
验证结果
执行上述任意一种方法后,输入Today | is | good | day都会得到期望输出:Today > is > good > day
内容的提问来源于stack exchange,提问作者user4836066
相关产品推荐
相关产品推荐

