如何使用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
相关产品推荐
相关产品推荐

