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

PySpark中如何对字符串类型列值进行递增式重命名

PySpark 对字符串列值按递增规则重命名的实现方法

核心实现逻辑是先提取目标字符串列的去重值,按照指定规则排序后分配递增序号,再将「原值-新名称」的映射关联回原数据集即可,两种常用排序规则的实现代码如下:


测试数据构造

先构造和示例一致的测试数据集:

from pyspark.sql import SparkSession
from pyspark.sql.functions import col, row_number, lit, concat, min as spark_min
from pyspark.sql.window import Window

spark = SparkSession.builder.appName("incr_rename").getOrCreate()

# 匹配示例结构的测试数据
source_data = [("A",10), ("B",20), ("A",30), ("C",15), ("B",25), ("C",35)]
df = spark.createDataFrame(source_data, schema=["category", "value"])

方案1:按字符串字典序递增重命名

即按照字符串本身的排序规则分配序号,比如A→cat_1、B→cat_2、C→cat_3:

# 生成去重值与递增新名称的映射表
value_map = df.select("category").distinct() \
    .withColumn("incr_id", row_number().over(Window.orderBy("category"))) \
    .withColumn("new_name", concat(lit("cat_"), col("incr_id")))

# 关联回原表替换原值
result = df.join(value_map, on="category", how="left") \
    .select(col("new_name").alias("category"), "value")

result.show()

方案2:按值首次出现顺序递增重命名

即按照值在原数据中第一次出现的先后顺序分配序号,不按字符串本身排序:

# 给原始数据加顺序标记,保留原始行序
df_with_seq = df.withColumn("tmp_seq", row_number().over(Window.orderBy(lit(1))))

# 按每个值第一次出现的位置排序分配序号
value_map = df_with_seq.groupBy("category") \
    .agg(spark_min("tmp_seq").alias("first_show_pos")) \
    .withColumn("incr_id", row_number().over(Window.orderBy("first_show_pos"))) \
    .withColumn("new_name", concat(lit("cat_"), col("incr_id")))

# 关联回原表替换原值
result = df_with_seq.join(value_map, on="category", how="left") \
    .select(col("new_name").alias("category"), "value")

result.show()

示例参考

  • 输入数据集示例:
    输入数据集示例
  • 预期输出数据集示例:
    输出数据集示例

可根据实际需求调整新名称前缀、序号起始值、排序规则,比如需要序号从0开始可以替换row_number()为monotonically_increasing_id()后做偏移处理。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 03:16:04