Databricks PySpark中如何在withColumn的CASE WHEN中包含多表达式
PySpark中withColumn内使用多个CASE WHEN的问题
问题背景
单个CASE WHEN逻辑的PySpark代码可正常运行:
from pyspark.sql.functions import expr df = sql("select * from xxxxxxx.xxxxxxx") transfromWithCol = (df.withColumn("MyTestName", expr("case when first_name = 'Peter' then 1 else 0 end")))
但尝试在同一个withColumn中传入第二个CASE WHEN表达式时触发错误:
from pyspark.sql.functions import expr df = sql("""select * from retailrpt.vw_fund_managers""") transfromWithCol = (df .withColumn("MyTestName", expr("case when first_name = 'Peter' then 1 else 0 end"), expr("case when last_name = 'Jones' then 5 else 4 end")))
报错信息:
TypeError: withColumn() takes 3 positional arguments but 4 were given
疑问:是否无法在同一个withColumn中添加多条CASE WHEN语句?若可行,正确做法是什么?
解决方案
核心原因
withColumn()方法的设计逻辑是每次仅能新增或修改一个列,它仅接受两个必填参数:目标列名、对应计算表达式。你传入第三个参数,自然会触发参数数量不匹配的错误。
两种可行实现方式
方式1:单个CASE WHEN表达式内合并多条件判断
如果需求是基于多个条件计算同一个列的值,可将所有判断逻辑整合到同一个CASE语句中:
from pyspark.sql.functions import expr df = sql("""select * from retailrpt.vw_fund_managers""") transfromWithCol = df.withColumn( "MyTestName", expr(""" case when first_name = 'Peter' then 1 when last_name = 'Jones' then 5 else 4 end """) )
CASE语句会按顺序匹配条件,满足第一个条件即返回对应值,后续条件不再执行;若所有条件都不满足,返回else后的默认值。
方式2:链式调用withColumn新增多列
如果需求是创建两个独立的列(分别对应两组CASE逻辑),需分开调用withColumn:
from pyspark.sql.functions import expr df = sql("""select * from retailrpt.vw_fund_managers""") transfromWithCol = (df .withColumn("TestFirstName", expr("case when first_name = 'Peter' then 1 else 0 end")) .withColumn("TestLastName", expr("case when last_name = 'Jones' then 5 else 4 end")) )
该方式会分别生成TestFirstName和TestLastName两个列,各自对应独立的判断逻辑。
内容的提问来源于stack exchange,提问作者Patterson
相关产品推荐
相关产品推荐

