我有一个包含 float
和 double
值的数据框。
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/