我有一个pyspark数据框,我想在其中添加一个数字值到另一个数字值。当原始数值从科学记号的字符串格式化为double时,它将起作用,而当将其格式化为float时,将产生舍入错误。
def updateValue(value):
return (value + 10)
updateValueUdf_double = udf(updateValue, DoubleType())
updateValueUdf_float = udf(updateValue, FloatType())
// create simple dataframe
data = [(0, "1E8")]
df = sqlContext.createDataFrame(data, ["row", "value"])
df2 = df.withColumn("value_d", col("value").cast("double"))\
.withColumn("value_du", updateValueUdf_double("value_d"))\
.withColumn("value_f", col("value").cast("float"))\
.withColumn("value_fu", updateValueUdf_float("value_f"))
df2.show(n=2)
当我运行上面的代码时,它为我提供了value_du的正确值,但为value_fu提供了错误的值,请参见下文。这是预期的行为,我应该始终使用DoubleType吗?
+---+-----+-------+-----------+-------+------------+
|row|value|value_d| value_du|value_f| value_fu|
+---+-----+-------+-----------+-------+------------+
| 0| 1E8| 1.0E8|1.0000001E8| 1.0E8|1.00000008E8|
+---+-----+-------+-----------+-------+------------+