如何在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的分布式计算逻辑
验证示例数据
运行上述代码后,示例数据会得到预期结果:
| id | id1 |
|---|---|
| 9999945678909 | 45678909 |
| 789065437 | 9065437 |
| 67898095 | 67898095 |
内容的提问来源于stack exchange,提问作者Scope
相关产品推荐
相关产品推荐

