val df = List((Float.NaN, Double.NaN), (1f, 0d)).toDF("x", "y") -6ren">
gpt4 book ai didi

scala - 为什么 Spark SQL 将 String "null"转换为 Float/Double 类型的 Object null?

转载 作者:行者123 更新时间:2023-12-01 11:20:44 27 4
gpt4 key购买 nike

我有一个包含 floatdouble 值的数据框。

scala> val df = List((Float.NaN, Double.NaN), (1f, 0d)).toDF("x", "y")
df: org.apache.spark.sql.DataFrame = [x: float, y: double]

scala> df.show
+---+---+
| x| y|
+---+---+
|NaN|NaN|
|1.0|0.0|
+---+---+

scala> df.printSchema
root
|-- x: float (nullable = false)
|-- y: double (nullable = false)

当我将 NaN 值替换为 null 值时,我将 null 作为字符串提供给 fill 中的 Map操作。

scala> val map = df.columns.map((_, "null")).toMap
map: scala.collection.immutable.Map[String,String] = Map(x -> null, y -> null)

scala> df.na.fill(map).printSchema
root
|-- x: float (nullable = true)
|-- y: double (nullable = true)


scala> df.na.fill(map).show
+----+----+
| x| y|
+----+----+
|null|null|
| 1.0| 0.0|
+----+----+

我得到了正确的值。但是我无法理解 Spark SQL 如何/为什么将 null 作为字符串转换为 null 对象?

最佳答案

如果您查看 Dataset 中的 fill 函数,它会检查数据类型并尝试转换为其列模式的数据类型。如果可以转换,则进行转换,否则返回 null。

它不会将“null”转换为对象null,但如果在转换时发生异常,它会返回null。

val map = df.columns.map((_, "WHATEVER")).toMap

给出空值

and val map = df.columns.map((_, "9999.99")).toMap

给出 9999.99

如果你想用相同的数据类型更新NAN,你可以得到预期的结果。

希望这能帮助你理解!

关于scala - 为什么 Spark SQL 将 String "null"转换为 Float/Double 类型的 Object null?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43930228/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com