如何在PySpark中使用AND运算符更新DataFrame并保留多条件结果
解决方案:保留两段条件的匹配结果
你的问题出在第二段代码的otherwise('')会覆盖掉第一段已经设置的senior值——当行已经满足第一段条件(department为senior)时,第二段的条件不触发,会执行otherwise('')把senior清空,最终只剩第二段的结果。
要同时保留两段的匹配结果,且不满足条件的字段设为null,可以用以下两种方式:
方式一:合并条件为一次链式判断
直接通过连续的when语句按优先级判断,一次完成列更新,逻辑更清晰:
from pyspark.sql import functions as F # 先判断更早的日期条件,匹配则设为senior;不匹配再判断第二个日期条件,匹配设为junior;其余设为null df1 = df1.withColumn( 'department', F.when(F.col('dateofjoining') < '2019-09-01', 'senior') .when(F.col('dateofjoining') < '2019-12-15', 'junior') .otherwise(None) )
方式二:分两次更新但保留原有值
如果必须分两次执行,需要修改第二段代码的otherwise逻辑,保留已经设置好的department值,而非设为空字符串:
from pyspark.sql import functions as F # 第一段:满足日期条件设为senior,其余设为null(而非空字符串) df1 = df1.withColumn('department', F.when(F.col('dateofjoining') < '2019-09-01', 'senior').otherwise(None)) # 第二段:仅当department为null且满足第二个日期条件时设为junior,否则保留原有值 df1 = df1.withColumn( 'department', F.when(F.col('department').isNull() & (F.col('dateofjoining') < '2019-12-15'), 'junior') .otherwise(F.col('department')) )
关键说明
- 方式一中,
when是按顺序匹配的,先匹配的条件会优先生效,所以要把更严格的日期条件(更早的日期)放在前面。 - 方式二中,第一段把不满足条件的设为
null而非空字符串,是为了和第二段的判断逻辑更清晰区分,避免空字符串和null的混淆。
内容的提问来源于stack exchange,提问作者DBd
相关产品推荐
相关产品推荐

