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

如何在PySpark中根据id长度条件填充id1列?

在PySpark DataFrame中根据id长度生成id1列的正确实现

问题分析

需要根据id字段的长度生成id1列:

  • 当id长度为13时,截取第6位到末尾的子串
  • 当id长度为9时,截取第3位到末尾的子串
  • 其他长度直接保留原id值

原代码的问题

你写的Python原生if语句无法实现预期逻辑,原因是:

  • length(col("id"))返回的是PySpark的Column对象,不是布尔值,直接用if判断会导致条件永远不成立(Column对象和整数无法直接比较出布尔结果)
  • 这种写法是在Driver端做全局判断,不是对DataFrame的每一行进行行级条件处理

正确实现代码

使用PySpark的when/otherwise函数来实现行级条件分支:

from pyspark.sql.functions import col, length, substring, when

ss_df = ss_df.withColumn(
    "id1",
    # 长度为13时,从第6位截取到末尾
    when(length(col("id")) == 13, substring(col("id"), 6, length(col("id")) - 5))
    # 长度为9时,从第3位截取到末尾
    .when(length(col("id")) == 9, substring(col("id"), 3, length(col("id")) - 2))
    # 其他情况保留原id
    .otherwise(col("id"))
)

代码说明

  • when(condition, value):满足条件时返回指定值,支持链式调用多个条件
  • substring(col, startPos, length):第三个参数用length(col("id")) - (startPos - 1)可以动态截取到字符串末尾,避免写固定长度(比如15)导致的截断或冗余
  • 所有操作都是在DataFrame的行级别执行,符合PySpark的分布式计算逻辑

验证示例数据

运行上述代码后,示例数据会得到预期结果:

idid1
999994567890945678909
7890654379065437
6789809567898095

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 06:15:39