Pyspark和Palantir Foundry中多条件设置列值为0的实现方法
问题分析
你提供的代码存在几处明显错误:
- 语法错误:第一个
when的条件判断结束后误用了.而非逗号分隔返回值 - 逻辑顺序错误:没有按照需求的优先级做判断
- 参数错误:
otherwise中错误传入判断表达式EDW_ABC.edw_xdpt_act_arrv_lb.isNull(),而非实际要返回的列值
正确实现
提供两种可直接运行的实现方案:
方案1:嵌套when写法(逻辑和需求完全对应,可读性高)
from pyspark.sql import functions as F EDW_ABC = EDW_ABC.withColumn( 'act_arrv_abc_lbs', # 第一列非空时直接取第一列值 F.when(EDW_ABC.edw_xdpt_act_arrv_lb.isNotNull(), EDW_ABC.edw_xdpt_act_arrv_lb) # 第一列为空时取第二列值 .when(EDW_ABC.edw_putt_act_arrv_lb.isNotNull(), EDW_ABC.edw_putt_act_arrv_lb) # 两列都为空时返回0 .otherwise(F.lit(0)) )
方案2:coalesce简化写法(代码更简洁,性能和方案1一致)
coalesce函数会返回参数列表中第一个非空的值,刚好匹配需求的优先级逻辑:
from pyspark.sql import functions as F EDW_ABC = EDW_ABC.withColumn( 'act_arrv_abc_lbs', F.coalesce( EDW_ABC.edw_xdpt_act_arrv_lb, EDW_ABC.edw_putt_act_arrv_lb, F.lit(0) ) )
内容的提问来源于stack exchange,提问作者confused101
相关产品推荐
相关产品推荐

