在 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 DataFrames - 使用不同类型的列之间的比较进行过滤