使用整数与十进制值在 Pyspark 中进行过滤
filtering in Pyspark using integer vs decimal values
我正在过滤一个DataFrame,当我传递一个整数值时,它只考虑那些满足DataFrame列值四舍五入为整数时的条件。为什么会这样?请参见下面的屏幕截图,两个过滤器给出不同的结果。我正在使用星火 2.2。我用 python 2.6 和 python 3.5 测试了它。结果是一样的
更新
我用 Spark-SQL 试过了。如果我不将该字段转换为双精度,它会给出与上面第一个相同的答案。但是,如果我在过滤前将该列转换为 double,它会给出正确答案。
为 lat > 60
给定一个双精度和一个整数,spark 隐式地将它们都转换为整数。结果是合适的,显示纬度 >= 61
对于 lat > cast(60 as double)
或 lat > 60.0
给定两个双打火花 returns 集合 [Infinity, 60.0) 中的所有东西,正如预期的那样
这可能有点un-intuitive,但是你必须记住spark在IntegerType()
和DoubleType()
之间执行隐式转换
虽然您使用的是 pyspark,但在幕后它是在 Scala 中,最终是 Java。所以Java的转换规则适用于此。
具体来说
https://docs.oracle.com/javase/specs/jls/se10/html/jls-5.html#jls-5.1.3
...Otherwise, if the floating-point number is not an infinity, the floating-point value is rounded to an integer value V, rounding toward zero using IEEE 754 round-toward-zero mode (§4.2.3).
我正在过滤一个DataFrame,当我传递一个整数值时,它只考虑那些满足DataFrame列值四舍五入为整数时的条件。为什么会这样?请参见下面的屏幕截图,两个过滤器给出不同的结果。我正在使用星火 2.2。我用 python 2.6 和 python 3.5 测试了它。结果是一样的
更新
我用 Spark-SQL 试过了。如果我不将该字段转换为双精度,它会给出与上面第一个相同的答案。但是,如果我在过滤前将该列转换为 double,它会给出正确答案。
为 lat > 60
给定一个双精度和一个整数,spark 隐式地将它们都转换为整数。结果是合适的,显示纬度 >= 61
对于 lat > cast(60 as double)
或 lat > 60.0
给定两个双打火花 returns 集合 [Infinity, 60.0) 中的所有东西,正如预期的那样
这可能有点un-intuitive,但是你必须记住spark在IntegerType()
和DoubleType()
虽然您使用的是 pyspark,但在幕后它是在 Scala 中,最终是 Java。所以Java的转换规则适用于此。
具体来说
https://docs.oracle.com/javase/specs/jls/se10/html/jls-5.html#jls-5.1.3
...Otherwise, if the floating-point number is not an infinity, the floating-point value is rounded to an integer value V, rounding toward zero using IEEE 754 round-toward-zero mode (§4.2.3).