You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)的行都会被排除。

你的输出异常的可能原因

  1. 代码执行偏差:确认实际运行的filter条件是否确实为sdf.salary > 300,是否存在误写(比如误加了salary.isNull()的逻辑)。
  2. 数据类型异常:检查DataFrame的schema,确认salary列是DoubleType而非StringType——如果是字符串类型,"NaN" > "300"可能因字符串比较规则返回TRUE,导致该行被保留。执行sdf.printSchema()验证。
  3. 环境配置或依赖问题:检查PySpark环境是否存在依赖冲突,或是否修改了Spark的核心配置(如spark.sql.ansi.enabled,启用ANSI模式会直接对NaN比较抛出错误,而非返回NULL)。
  4. 数据转换问题:确认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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 02:15:31