Spark Java拆分拼接字符串:使用selectExpr split函数遇异常表结构
解决Spark中使用selectExpr拆分拼接字符串的问题
看你的表结构,应该是想把用|分隔的genres列拆分成分类数组,但目前得到的genres1列变成了单个字符的数组——这大概率是因为|在正则表达式里属于特殊字符,直接用它作为split的分隔符会被当成“或”逻辑处理,所以才把每个字符都拆出来了。
下面给你两种靠谱的解决方法,都是用selectExpr实现的:
方法一:转义特殊分隔符
因为split函数的第二个参数是正则表达式,所以需要把|转义成\\|(Spark字符串里要做双转义处理):
// Scala 示例 df.selectExpr("genres", "split(genres, '\\\\|') as split_genres").show()
# Python 示例 df.selectExpr("genres", "split(genres, '\\\\|') as split_genres").show()
这样就能把Adventure|Animation这类字符串拆成["Adventure", "Animation"]的正常数组了。
方法二:用字符类包裹分隔符
另一种更简洁的方式是把|放到正则字符类[]里,这样它就会被当作普通字符识别,不用额外转义:
df.selectExpr("genres", "split(genres, '[|]') as split_genres").show()
额外优化:处理多余分隔符
如果你的genres列存在开头/结尾多余的|,可以结合trim函数先清理再拆分:
df.selectExpr("genres", "split(trim('|', genres), '\\\\|') as split_genres").show()
执行后你会得到符合预期的结果:
+-----------------------+-----------------------------+ | genres | split_genres | +-----------------------+-----------------------------+ |Adventure|Animation |[Adventure, Animation] | |Adventure|Children |[Adventure, Children] | |Comedy|Drama|Romance |[Comedy, Drama, Romance] | +-----------------------+-----------------------------+
内容的提问来源于stack exchange,提问作者Pepo
相关产品推荐
相关产品推荐

