星火替换所有NaN的数据帧API中为null

问题描述 投票:1回答:2

我有很多双(和/或浮动)列,其中确实包含NaN的一个数据帧。我想,以取代空所有的NaN(即的Float.NaN和Double.NaN)。

我可以如这样做对于单个列x

val newDf = df.withColumn("x", when($"x".isNaN,lit(null)).otherwise($"x"))

这工作,但我想在一次对所有列做到这一点。我最近发现了DataFrameNAFunctionsdf.nafill这听起来exactely我需要什么。不幸的是我没有做到以上。 fill应更换所有NaN和空值与给定值,所以我做的:

df.na.fill(null.asInstanceOf[java.lang.Double]).show

这给了我一个NullpointerException

还有一种有前途的方法replace,但我甚至不能编译的代码:

df.na.replace("x", Map(java.lang.Double.NaN -> null.asInstanceOf[java.lang.Double])).show

奇怪的是,这给了我

Error:(57, 34) type mismatch;
 found   : scala.collection.immutable.Map[scala.Double,java.lang.Double]
 required: Map[Any,Any]
Note: Double <: Any, but trait Map is invariant in type A.
You may wish to investigate a wildcard type such as `_ <: Any`. (SLS 3.2.10)
    df.na.replace("x", Map(java.lang.Double.NaN -> null.asInstanceOf[java.lang.Double])).show
scala apache-spark spark-dataframe
2个回答
4
投票

要在星火null替换所有NaN(S),你只需要创建替换值每列,这样的Map

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

然后你可以使用fill空值替换为NaN(S):

df.na.fill(map)

例如:

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> 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|
+----+----+

我希望这有帮助 !


0
投票

要使用Pyspark API,你可以做以下的星火据帧替换所有楠的任何值:

col_list = [COLUMN1,列2] DF = df.na.fill(replace_by_value,col_list)

© www.soinside.com 2019 - 2024. All rights reserved.