PySpark中使用when/otherwise生成新列丢失AAAA行的问题求助
问题分析与修正
你的代码存在两个核心问题,同时你提到的“AAAA行丢失”大概率是描述偏差(select操作不会删除行,更可能是C列值不符合预期):
1. 错误将非目标值转为字符串"null"
你在when分支里赋值的是字符串"null",但你实际需要的是Spark的空值(None)。这会导致C列类型变成纯字符串类型(混合了原A列的字符串和新的"null"字符串),而非你期望的“字符串+空值”类型,同时也不符合“转为null”的需求。
2. 逻辑不够严谨
虽然当前代码对Spark空值的处理是正确的(当A是null时,~col("A").isin(...)返回null,when会将null视为false,走otherwise保留原null),但显式判断col("A").isNull()能让逻辑更清晰,避免因Spark版本差异或特殊场景导致的歧义。
修正后的代码
import pyspark.sql.functions as F from pyspark.sql import col df2 = df1.select( col('*'), F.when( col("A").isNull() | col("A").isin(['AAAA', 'BBBB']), col("A") ).otherwise(F.lit(None)).alias("C") )
这段代码的逻辑完全匹配你的需求:
- 当A是Spark空值,或值为
AAAA/BBBB时,C列保留A的原始值 - 其他情况(如
none、CCCC),C列设为Spark空值
如果确实出现AAAA行的C列值不对,检查A列的实际值是否和['AAAA','BBBB']完全一致(比如是否有大小写差异、空格等)。
内容的提问来源于stack exchange,提问作者Ussopokingo
相关产品推荐
相关产品推荐

