Spark DataFrame中替换字符串最后一个空格为冒号的实现方法
实现方案
方案1:正则表达式替换(推荐,适配固定格式场景)
利用Spark的regexp_replace函数,通过正则匹配最后一个空格并替换为冒号。正则表达式(\s)(?!.*\s)可精准定位最后一个空格(匹配后面不再包含空格的空格)。
Python 代码示例:
from pyspark.sql import functions as F # 假设你的DataFrame名为df,目标列为DTC df = df.withColumn("DTC_formatted", F.regexp_replace(F.col("DTC"), r"(\s)(?!.*\s)", ":")) # 查看结果 df.show(truncate=False)
Scala 代码示例:
import org.apache.spark.sql.functions._ // 假设你的DataFrame名为df,目标列为DTC val dfFormatted = df.withColumn("DTC_formatted", regexp_replace(col("DTC"), """(\s)(?!.*\s)""", ":")) // 查看结果 dfFormatted.show(false)
方案2:分割拼接法(适合格式完全固定的场景)
如果确认所有字符串都是「日 月 年 时分」的四部分格式,可先按空格分割为数组,再将前三部分用空格拼接,最后和第四部分用冒号连接。
Python 代码示例:
from pyspark.sql import functions as F df = df.withColumn("DTC_parts", F.split(F.col("DTC"), " ")) \ .withColumn("DTC_formatted", F.concat( F.concat_ws(" ", F.col("DTC_parts")[0], F.col("DTC_parts")[1], F.col("DTC_parts")[2]), F.lit(":"), F.col("DTC_parts")[3] )) \ .drop("DTC_parts") # 可选:删除中间生成的列 df.show(truncate=False)
Scala 代码示例:
import org.apache.spark.sql.functions._ val dfFormatted = df.withColumn("DTC_parts", split(col("DTC"), " ")) .withColumn("DTC_formatted", concat( concat_ws(" ", col("DTC_parts")(0), col("DTC_parts")(1), col("DTC_parts")(2)), lit(":"), col("DTC_parts")(3) )) .drop("DTC_parts") // 可选:删除中间列 dfFormatted.show(false)
说明
- 方案1更通用,即使日期部分出现意外空格(比如特殊月份名称带空格),只要最后一个空格是日期与时间的分隔符,就能正确替换。
- 方案2依赖固定的四部分格式,若格式变动会出错,但性能略优。
内容的提问来源于stack exchange,提问作者Vikas Garud
相关产品推荐
相关产品推荐

