SparkSQL中filter函数对NaN值过滤不生效问题咨询
Spark SQL filter 未过滤 NaN 行的原因及解决方案
核心原因
该现象是Spark SQL和Python原生对NaN的比较规则差异导致的,不属于BUG:
- Python(含numpy)中,任意数值和
np.nan做比较都会返回False,符合你本地测试的结果 - Spark SQL为了兼容排序场景下的NaN处理,自定义了NaN的比较逻辑:
- 所有非NaN的数值都小于NaN
- NaN和NaN判断相等
因此你的过滤条件px_variation > 0.15中,NaN和0.15比较的结果为TRUE,会被filter操作保留。
解决方案
如果需要过滤掉NaN行,需要在逻辑中显式排除NaN值,有两种常用实现方式:
- 直接修改过滤条件,加入内置
isnan()判断:
self.filters = 'px_variation > 0.15 AND NOT isnan(px_variation)' df.filter(self.filters)
- 先丢弃目标列含NaN的行再执行过滤:
df.na.drop(subset=['px_variation']).filter(self.filters)
注意:如果需要同时排除NULL值,可以额外补充
px_variation IS NOT NULL的判断条件。
内容的提问来源于stack exchange,提问作者fiticida
相关产品推荐
相关产品推荐

