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

如何为版本号不定段统一补前导零(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"))
)

方案优势

  1. 通用性强:不管版本号是3段、4段还是更多,都能自动遍历每一段补零,无需修改代码适配段数变化。
  2. 拆分更精准:用split(" - ", 2)拆分版本号和名称部分,避免原方案按空格拆分时,名称含空格导致的拆分错误。
  3. 逻辑清晰:通过when-otherwise精准过滤需要处理的行,非数字开头的字符串直接保留原内容。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 11:07:54