使用Spark expr调用rtrim遇ParseException,求原因及解决办法
错误原因
Spark SQL的rtrim函数不支持标准SQL里TRAILING ']' FROM name的语法格式。Spark的rtrim仅接受两个参数:第一个是要修剪的目标字符,第二个是待处理的字符串列,语法为rtrim(trimStr, str)。你写的表达式是标准SQL的TRIM语法,Spark无法解析,因此抛出语法错误。
正确解决方案
根据你修剪name列多余字符的需求(比如尾部的]、开头的空格和[),提供几种可行方案:
方案1:用Spark原生rtrim/ltrim/trim函数
如果只需要修剪尾部的],直接用Spark的rtrim:
df.\ withColumn("correct_name", expr("rtrim(']', name)")).\ select("correct_name").\ show()
如果要同时修剪开头的[和尾部的],可以嵌套使用ltrim和rtrim:
df.\ withColumn("correct_name", expr("rtrim(']', ltrim('[', name))")).\ select("correct_name").\ show()
如果还要处理开头的空格(比如第二条数据的" Thomas Kingston"),再加一层trim():
df.\ withColumn("correct_name", expr("rtrim(']', ltrim('[', trim(name)))")).\ select("correct_name").\ show()
方案2:用正则表达式替换(regexp_replace)
如果需要一次性处理多种多余字符(开头的空格/[、结尾的]),正则会更灵活:
df.\ withColumn("correct_name", expr("regexp_replace(name, '^\\s*\\[|\\]$', '')")).\ select("correct_name").\ show()
这个正则的含义:
^\\s*\\[:匹配开头的任意空格+[|:或逻辑\\]$:匹配结尾的]- 把匹配到的内容替换为空字符串,一次性完成所有修剪。
方案3:Spark 3.0+ 用标准SQL兼容的trim语法
Spark 3.0及以上版本支持标准SQL的TRAILING/FROM语法,但只能用trim函数(rtrim不支持),比如修剪尾部的]:
df.\ withColumn("correct_name", expr("trim(TRAILING ']' FROM name)")).\ select("correct_name").\ show()
验证结果
执行上述正确代码后,输出结果如下:
+-------------+ |correct_name | +-------------+ |Lisa Brenan | |Thomas Kingston| |Lucy Pierson | +-------------+
内容的提问来源于stack exchange,提问作者awesome_sangram
相关产品推荐
相关产品推荐

