如何仅移除DataFrame数值中的逗号而保留字符串中的逗号?
解决方案
要实现只移除纯数值字符串中的逗号,同时保留含非数字内容的字符串里的逗号,可以结合when条件判断和正则表达式来处理:
代码实现(Scala 示例)
import org.apache.spark.sql.functions._ // 处理COST列 val processedDF = df.withColumn("COST", // 判断当前字符串是否为纯数值格式(支持带千位分隔符和小数点) when(col("COST").rlike("^\\d+(,\\d+)*\\.\\d+$|^\\d+(,\\d+)*$"), // 纯数值则移除所有逗号 regexp_replace(col("COST"), ",", "") ).otherwise( // 非纯数值则保持原内容 col("COST") ) )
正则说明
- 匹配纯数值的正则
^\\d+(,\\d+)*\\.\\d+$|^\\d+(,\\d+)*$:^\\d+(,\\d+)*\\.\\d+$:匹配带小数点的数值(如1,350.45)^\\d+(,\\d+)*$:匹配整数形式的数值(如11,340)
- 只有符合上述纯数值格式的行,才会执行逗号移除操作,其他含字母、文本的行完全保留原内容。
为什么你之前的代码不行
你用的regexp_replace(df("COST"), "\\p{Sc}|,", "")会匹配所有逗号,不管它是在数值里还是字符串里,所以会把N,A、A,B,C.30这类字符串中的逗号也一并删除,不符合需求。
如果需要支持负数数值,只需把匹配纯数值的正则修改为^-?\\d+(,\\d+)*\\.\\d+$|^-?\\d+(,\\d+)*$即可。
内容的提问来源于stack exchange,提问作者ConfusedDeveloper
相关产品推荐
相关产品推荐

