PySpark 3.3.2过滤salary>300时保留NaN值,与预期不符求解答
PySpark filter(salary > 300) 保留NaN行的问题分析
你的输出不符合PySpark的正常行为,ChatGPT给出的结果是正确的——执行filter(salary > 300)后,不应该包含salary为NaN的行。
核心原理
在PySpark中:
- 当对NaN值进行比较运算(如
salary > 300)时,结果为NULL(布尔逻辑中的UNKNOWN)。 filter(或where)操作只会保留条件结果为TRUE的行,FALSE和NULL对应的行都会被过滤掉。
因此,你的测试代码正常执行后,应该只输出John的行,而Jane(salary为NaN)和Mike(salary=200)的行都会被排除。
你的输出异常的可能原因
- 代码执行偏差:确认实际运行的
filter条件是否确实为sdf.salary > 300,是否存在误写(比如误加了salary.isNull()的逻辑)。 - 数据类型异常:检查DataFrame的schema,确认
salary列是DoubleType而非StringType——如果是字符串类型,"NaN" > "300"可能因字符串比较规则返回TRUE,导致该行被保留。执行sdf.printSchema()验证。 - 环境配置或依赖问题:检查PySpark环境是否存在依赖冲突,或是否修改了Spark的核心配置(如
spark.sql.ansi.enabled,启用ANSI模式会直接对NaN比较抛出错误,而非返回NULL)。 - 数据转换问题:确认Pandas DataFrame中的
None转成Spark DataFrame后是否为NaN而非其他特殊值,可通过sdf.select(salary).show()查看原始数据。
验证步骤
执行以下代码确认比较逻辑的结果:
sdf.select(sdf.name, sdf.salary, (sdf.salary > 300).alias("salary_gt_300")).show()
正常输出应为:
+----+------+-------------+ |name|salary|salary_gt_300| +----+------+-------------+ |John| 400.0| true| |Jane| NaN| null| |Mike| 200.0| false| +----+------+-------------+
此时filter(salary_gt_300)只会保留true对应的行。
内容的提问来源于stack exchange,提问作者Nitesh Jangir
相关产品推荐
相关产品推荐

