Spark 中的列乘法
Column Multiplication in Spark
我正在尝试将 Spark 中的两列相乘。两列都是 Double 类型。
26.0 和 0.001 之间的乘法结果是 0.026000000000000002 而不是 0.0026。
我该如何解决?
>>> df.printSchema()
root
|-- age: double (nullable = true)
|-- name: string (nullable = true)
|-- mul: double (nullable = false)
>>> df.withColumn('res', df['age']*df['mul']).show()
+----+--------+-----+--------------------+
| age| name| mul| res|
+----+--------+-----+--------------------+
|25.0| Ankit|0.001| 0.025|
|22.0|Jalfaizy|0.001| 0.022|
|20.0| saurabh|0.001| 0.02|
|26.0| Bala|0.001|0.026000000000000002|
+----+--------+-----+--------------------+
谢谢
将其转换为浮点数:
from pyspark.sql.functions import udf,explode
from pyspark.sql.types import StringType
table_schema = StructType([
StructField("value", FloatType(), True)])
df= spark.createDataFrame(
[
( 0.026000000000000002,)
],table_schema
)
df.show()
列舍入到 4 位小数:
import pyspark.sql.functions as F
df = df.withColumn("res", F.round(F.col("res"), 4)
这些是浮点错误。
一个简单的 1.1-1.0
在 Python(或 Pyspark)中给出 0.10000000000000009
。
您可以找到有关它们的更多信息 here or in this Whosebug answer
四舍五入到适当的小数位似乎是解决这个问题的简单方法。
我正在尝试将 Spark 中的两列相乘。两列都是 Double 类型。 26.0 和 0.001 之间的乘法结果是 0.026000000000000002 而不是 0.0026。 我该如何解决?
>>> df.printSchema()
root
|-- age: double (nullable = true)
|-- name: string (nullable = true)
|-- mul: double (nullable = false)
>>> df.withColumn('res', df['age']*df['mul']).show()
+----+--------+-----+--------------------+
| age| name| mul| res|
+----+--------+-----+--------------------+
|25.0| Ankit|0.001| 0.025|
|22.0|Jalfaizy|0.001| 0.022|
|20.0| saurabh|0.001| 0.02|
|26.0| Bala|0.001|0.026000000000000002|
+----+--------+-----+--------------------+
谢谢
将其转换为浮点数:
from pyspark.sql.functions import udf,explode
from pyspark.sql.types import StringType
table_schema = StructType([
StructField("value", FloatType(), True)])
df= spark.createDataFrame(
[
( 0.026000000000000002,)
],table_schema
)
df.show()
列舍入到 4 位小数:
import pyspark.sql.functions as F
df = df.withColumn("res", F.round(F.col("res"), 4)
这些是浮点错误。
一个简单的 1.1-1.0
在 Python(或 Pyspark)中给出 0.10000000000000009
。
您可以找到有关它们的更多信息 here or in this Whosebug answer
四舍五入到适当的小数位似乎是解决这个问题的简单方法。