Spark 2.2 PySpark SQL中Split函数使用句号分割异常求助
关于PySpark SQL中Split函数使用句号分割失效的问题解答
嘿,这个问题我之前用Spark的时候也踩过一模一样的坑,其实核心是Python字符串转义和Spark SQL正则解析的双重处理逻辑在搞鬼,咱们一步步理清楚:
为什么\.不生效?
当你在Python代码里写:
spark.sql("select split('a.aaa','\\.')").show()
Python会先对字符串里的转义字符做解析——\\会被转换成单个\,所以实际传给Spark SQL的语句其实是:
select split('a.aaa','.')
而Spark的split函数的分隔符参数是正则表达式,在正则规则里.是匹配任意字符的通配符,这就相当于把字符串里的每一个字符都当成了分隔符,最终得到的自然是每个字符之间的空字符串数组,也就是你看到的[, , , , , ]。
正确的解决方法
有两种靠谱的方式可以搞定这个问题:
1. 用Python的双重转义
既然Python会先解析一次转义,那我们就得在代码里写四个反斜杠,让Python解析后传递给Spark的是\.(正则里表示字面量句号的写法):
spark.sql("select split('a.aaa','\\\\.')").show()
执行这个语句后,就能得到预期结果:
+-----------------+ |split(a.aaa, \.)| +-----------------+ | [a, aaa]| +-----------------+
2. 使用正则字符类[.]
你已经发现这种方法有效了,因为在正则的字符类[]里,.会被当作普通的字面量字符,不会触发通配符功能,这种写法更简洁,也不容易搞混转义次数:
spark.sql("select split('a.aaa','[.]')").show()
总结
- 本质问题是Python字符串转义与Spark正则解析的双重处理,导致
\.没有被正确传递为正则字面量 - 两种解决方案:双重转义
\\\\.,或者使用字符类[.],后者更推荐,写法直观不容易出错
内容的提问来源于stack exchange,提问作者some_user
相关产品推荐
相关产品推荐

