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
相关产品推荐
相关产品推荐

