You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用regexp_replace将多列空格替换为Null值(Spark SQL)

如何在Spark SQL中将多列中的空格替换为Null值?

先帮你梳理下原代码里存在的几个问题:

  • withColumn方法一次只能处理单个列,没办法同时传入多个列名进行批量修改
  • regexp_replace的参数使用有误,而且你想替换的是全空格/空字符串为null,仅用^\\s*只能匹配开头的空格,覆盖场景不够全面
  • filter的语法错误,多列判断null的写法不符合Spark SQL的规则,不能直接写"col_1,col_2 is null"

接下来看正确的实现方案,分两种场景处理:

方式一:逐个处理列

如果需要处理的列不多,可以直接逐个调用withColumn,结合trim和when函数实现——先去掉列值前后的空格,判断是否为空字符串,是的话替换为null,否则保留原值:

import org.apache.spark.sql.functions._

// 先处理col_1
val tempDf = df.withColumn("col_1", when(trim(col("col_1")) === "", lit(null)).otherwise(col("col_1")))
// 再处理col_2
val resultDf = tempDf.withColumn("col_2", when(trim(col("col_2")) === "", lit(null)).otherwise(col("col_2")))

方式二:批量处理多列

如果要处理的列很多,用foldLeft遍历列列表来批量处理会更高效:

import org.apache.spark.sql.functions._

// 定义需要处理的列名列表
val targetCols = List("col_1", "col_2")

// 批量遍历处理每一列
val resultDf = targetCols.foldLeft(df) { (currentDf, colName) =>
  currentDf.withColumn(
    colName,
    when(trim(col(colName)) === "", lit(null)).otherwise(col(colName))
  )
}

验证结果

执行完上面的代码后,调用show()就能得到你期望的输出:

resultDf.show()

输出结果:

+---+-----+-----+
| Id|col_1|col_2|
+---+-----+-----+
| 0|104 | Null|
| 1|Null | Null|
+---+-----+-----+

如果需要筛选出col_1和col_2都为null的行,正确的filter写法如下:

resultDf.filter(col("col_1").isNull && col("col_2").isNull).show()

这会输出第二行数据:

+---+-----+-----+
| Id|col_1|col_2|
+---+-----+-----+
| 1|Null | Null|
+---+-----+-----+

内容的提问来源于stack exchange,提问作者Praveen Saini

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 07:54:39