Spark Scala DataFrame无法去除尾随空格问题求助
解决Spark Scala中DataFrame字段尾随空白无法去除的问题
从你的输出能看出来,e_no字段显示的是数字,但长度比数字本身的位数多,说明你要处理的不是普通的半角空格,再加上你的正则表达式写法有错误,才导致regexp_replace和rtrim都没生效。下面一步步给你解决:
1. 先修正正则表达式的错误
你写的regexp_replace(col("e_no"),"//s+$","")里,正则的转义符写错了!在Scala字符串中,要表示正则里的\s(匹配普通空白),需要用双反斜杠\\s,也就是正确的写法是"\\s+$"。这个错误会导致你的正则完全匹配不到任何内容,自然无法替换。
2. 排查尾随的到底是什么空白字符
如果修正正则后还是不行,那说明尾随的是非普通空白字符,比如全角空格(中文空格,\u3000)、非断空格(\u00A0)这类,Spark的rtrim()默认只处理半角空格(\u0020),对这些字符无效。
你可以先通过hex()函数查看字符的十六进制编码,确定具体是哪种字符:
df.select( col("e_no"), length(col("e_no")), hex(col("e_no")).alias("hex_code") // 查看字符的十六进制编码 ).show()
- 如果是全角空格,
hex_code末尾会是E38080 - 如果是非断空格,末尾会是
C2A0 - 普通半角空格的话是
20
3. 针对性的解决方案
方案一:匹配所有Unicode空白字符
用正则\\p{Space}+$可以匹配所有Unicode标准中的空白字符,包括半角空格、全角空格、制表符等:
df.select( col("e_no"), regexp_replace(col("e_no"), "\\p{Space}+$", "").alias("trimmed_e_no"), length(regexp_replace(col("e_no"), "\\p{Space}+$", "")).alias("trimmed_length") ).show()
方案二:针对特定空白字符处理
如果已经通过hex()确定了是某类特定空白,比如全角空格,可以直接指定对应的正则:
// 去除全角尾随空格 df.select( col("e_no"), regexp_replace(col("e_no"), "\\u3000+$", "").alias("trimmed_e_no"), length(regexp_replace(col("e_no"), "\\u3000+$", "")).alias("trimmed_length") ).show()
方案三:自定义UDF处理
如果需要更灵活的处理逻辑,可以自定义UDF来去除所有尾随空白:
import org.apache.spark.sql.functions.udf val trimAllTrailingWhitespace = udf((str: String) => str.replaceAll("\\p{Space}+$", "")) df.select( col("e_no"), trimAllTrailingWhitespace(col("e_no")).alias("trimmed_e_no"), length(trimAllTrailingWhitespace(col("e_no"))).alias("trimmed_length") ).show()
内容的提问来源于stack exchange,提问作者user3222101
相关产品推荐
相关产品推荐

