使用整数与十进制值在Pyspark中进行过滤

使用整数与十进制值在Pyspark中进行过滤,pyspark,spark-dataframe,Pyspark,Spark Dataframe,我正在过滤一个数据帧,当我传递一个整数值时,它只考虑那些在数据帧列值四舍五入为整数时满足条件的数据帧。为什么会这样?请参见下面的屏幕截图,这两个过滤器给出不同的结果。我使用的是Spark 2.2。我用Python2.6和Python3.5测试了它。结果是一样的 使现代化 我用Spark SQL试过了。如果我不将字段转换为double,它给出的答案与上面的第一个答案相同。但是,如果在过滤之前将列强制转换为double,它将给出正确的答案 对于lat>60 给定一个双精度和一个整数,spark会隐

我正在过滤一个数据帧,当我传递一个整数值时,它只考虑那些在数据帧列值四舍五入为整数时满足条件的数据帧。为什么会这样?请参见下面的屏幕截图,这两个过滤器给出不同的结果。我使用的是Spark 2.2。我用Python2.6和Python3.5测试了它。结果是一样的

使现代化 我用Spark SQL试过了。如果我不将字段转换为double,它给出的答案与上面的第一个答案相同。但是,如果在过滤之前将列强制转换为double,它将给出正确的答案


对于
lat>60

给定一个双精度和一个整数,spark会隐式地将两者转换为整数。结果是合适的,显示纬度>=61

用于
lat>cast(60双精度)
lat>60.0
给定两个双精度,spark将按预期返回集合中的所有内容[Infinity,60.0]


这可能有点不直观,但您必须记住spark正在执行
IntegerType()
DoubleType()之间的隐式转换
lat>60

给定一个双精度和一个整数,spark隐式地将两者转换为整数。结果是合适的,显示纬度>=61

用于
lat>cast(60双精度)
lat>60.0
给定两个双精度,spark将按预期返回集合中的所有内容[Infinity,60.0]


这可能有点不直观,但您必须记住,spark正在执行
IntegerType()
DoubleType()

之间的隐式转换。虽然您使用pyspark,但它在Scala中,最终在Java中。因此Java的转换规则适用于这里

具体地说

…否则,如果浮点数不是无穷大,则将浮点数四舍五入为整数值V,并使用IEEE 754向零舍入模式(§4.2.3)向零舍入


虽然您使用pyspark,但它在Scala中,最终是Java中。因此Java的转换规则适用于这里

具体地说

…否则,如果浮点数不是无穷大,则将浮点数四舍五入为整数值V,并使用IEEE 754向零舍入模式(§4.2.3)向零舍入


当你使用
60L
时会发生这种情况吗?是的,使用60L不能解决它。在Python2中,它给出了与python3相同的答案,它给出了SyntaxError。首先。第二,请提供一个示例,以便我们可以尝试重新创建你的问题。更多信息。在Spark 1.6中,它按预期工作。当你使用
60L
时会发生这种情况吗?是的,使用60L不能解决它。在Python2,它给出了与python3相同的答案,它给出了SyntaxError。首先。其次,请提供一个示例,以便我们可以尝试重新创建您的问题。更多信息。在Spark 1.6中,它按预期工作。