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

Posted

技术标签:

【中文标题】在 Pyspark 中使用整数与十进制值进行过滤【英文标题】:filtering in Pyspark using integer vs decimal values 【发布时间】:2018-03-23 15:28:45 【问题描述】:

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

更新

我使用 Spark-SQL 进行了尝试。如果我不将该字段转换为双精度,它会给出与上面第一个相同的答案。但是,如果我在过滤之前将列转换为加倍,它会给出正确的答案。

【问题讨论】:

你使用60L时会出现这种情况吗? 是的,用60L解决不了。在 Python2 中,它在 python3 中给出了相同的答案,它给出了 SyntaxError。 首先don't post pictures of code。其次,请提供minimal reproducible example,以便我们尝试重现您的问题。更多关于how to create good reproducible apache spark dataframe examples. 在 Spark 1.6 中它按预期工作。 【参考方案1】:

lat > 60

给定一个 double 和一个整数 spark 隐式地将它们都转换为整数。结果合适,显示纬度 >= 61

对于lat > cast(60 as double)lat > 60.0 给定两个双打 spark 返回集合 [Infinity, 60.0) 中的所有内容,如预期的那样

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

【讨论】:

【参考方案2】:

虽然您使用 pyspark,但它的底层是 Scala,最终还是 Java。所以这里适用Java的转换规则。

具体来说

https://docs.oracle.com/javase/specs/jls/se10/html/jls-5.html#jls-5.1.3

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

【讨论】:

以上是关于在 Pyspark 中使用整数与十进制值进行过滤的主要内容,如果未能解决你的问题,请参考以下文章

在pyspark中使用整数对列进行编码

在 pyspark 中应用 udf 过滤功能

PySpark DataFrames - 使用不同类型的列之间的比较进行过滤

无法在pyspark数据框中以十进制类型保存十进制值

组成原理中关于小数和整数关于十,二,十六,八进制之间任意的转换

PySpark - 如何根据列中的两个值从数据框中过滤出连续的行块