PySpark中整数与小数过滤差异问题排查
关于Spark 2.2中DataFrame整数过滤的匹配异常问题
我在测试Spark 2.2版本时(覆盖Python 2.6和3.5环境),碰到了一个DataFrame过滤的诡异行为:当用整数值作为过滤条件时,Spark并不会严格匹配列的实际数值,而是会匹配该列值取整后满足条件的记录,这直接导致不同过滤方式得到完全不一致的结果。
具体现象
- 假设DataFrame中有一个
double类型的列,当执行df.filter(df['value'] == 1)这类整数条件过滤时,不仅会选中值为1.0的记录,连1.1、1.8这种取整后等于1的数值也会被包含进来,完全不符合我们预期的严格相等匹配。 - 但如果把过滤条件改成浮点数值(比如
df.filter(df['value'] == 1.0)),就能得到仅匹配1.0的正确结果。
Spark-SQL的验证结果
为了确认问题根源,我又用Spark-SQL做了补充测试:
- 直接执行
SELECT * FROM test_table WHERE value = 1时,结果和DataFrame API的整数过滤一致,会把取整后符合条件的记录都拉出来; - 但如果先将列显式转换为
double类型再过滤,比如SELECT * FROM test_table WHERE CAST(value AS DOUBLE) = 1.0,就能得到严格匹配的正确结果。
解决方案
针对这个Spark 2.2版本的已知问题,有两个可靠的解决思路:
- 在DataFrame过滤时,使用与列类型匹配的浮点数值替代整数作为条件,保证类型一致;
- 使用Spark-SQL时,要么确保过滤条件的数值类型和列类型对齐,要么显式转换列类型后再执行过滤逻辑。
内容的提问来源于stack exchange,提问作者Fisseha Berhane
相关产品推荐
相关产品推荐

