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

标签 scala apache-spark apache-spark-sql spark-dataframe

我有一个包含 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/

相关文章:

mysql - 如何通过SQL查询检查列的数值是否包含字母

scala - 使用scala将Spark处理后的结果转储到HDFS

algorithm - 查找具有给定总和的子数组

java - 使用 Spark/Java 获取每行数据帧的当前时间戳

scala - 计算 ALS 模型中的 RMSE

java - 如何使用 Java 和 Spark SQL 打印数据集中的行内容?

java - 如何从 Java 调用 Scala 的 HashMap.toArray()?

scala - 展平列表 + Scala 的 future

java - 在 Pyspark 中访问 JavaRDD

java - 如何使用 Java 将 Spark 数据集的所有列转换为字符串