如何为版本号不定段统一补前导零(Spark实现)
通用版本号补零优化方案
核心思路
利用Spark高阶函数transform遍历版本号的每一段,动态为每段补前导零至两位,无需硬编码段数,适配任意段数的版本号(如1.20.3、10.20.30.40等),同时精准区分需要处理的版本号行和无需处理的标签行。
实现代码
Scala版本
import org.apache.spark.sql.functions._ val processedDf = df.withColumn( "fullname_processed", when( // 判断字符串开头是否为数字,仅处理这类行 col("fullname").substr(1, 1).cast("int").isNotNull, concat_ws( " - ", // 处理版本号部分:拆分每段→补零→拼接 concat_ws( ".", transform( split(split(col("fullname"), " - ", 2)(0), "\\."), segment => lpad(segment, 2, "0") ) ), // 保留原名称部分 split(col("fullname"), " - ", 2)(1) ) ).otherwise(col("fullname")) )
Python版本
from pyspark.sql import functions as F processed_df = df.withColumn( "fullname_processed", F.when( # 判断开头是否为数字 F.col("fullname").substr(1, 1).cast("int").isNotNull, F.concat_ws( " - ", # 动态处理版本号每一段 F.concat_ws( ".", F.transform( F.split(F.split(F.col("fullname"), " - ", 2)[0], "\\."), lambda segment: F.lpad(segment, 2, "0") ) ), # 保留原名称 F.split(F.col("fullname"), " - ", 2)[1] ) ).otherwise(F.col("fullname")) )
方案优势
- 通用性强:不管版本号是3段、4段还是更多,都能自动遍历每一段补零,无需修改代码适配段数变化。
- 拆分更精准:用
split(" - ", 2)拆分版本号和名称部分,避免原方案按空格拆分时,名称含空格导致的拆分错误。 - 逻辑清晰:通过
when-otherwise精准过滤需要处理的行,非数字开头的字符串直接保留原内容。
内容的提问来源于stack exchange,提问作者multiblue
相关产品推荐
相关产品推荐

