如何替换DataFrame列中的空值?

时间:2018-05-09 19:33:48

标签: scala apache-spark spark-dataframe

如何替换DataFrame Field1的{​​{1}}列中的空值?

df

此命令未提供预期结果:

Field1 Field2
       AA
12     BB

预期结果:

df.na.fill("Field1",Seq("Anonymous"))

3 个答案:

答案 0 :(得分:2)

  

Fill:返回一个替换null或NaN值的新DataFrame   带有值的数字列。

两件事:

  1. 空字符串不为null或NaN,因此您必须使用case语句。
  2. 将文本值提供给数字列时,填充似乎无法正常工作。
  3. 使用填充/文字替换失败:

    scala> a.show
    +----+---+
    |  f1| f2|
    +----+---+
    |null| AA|
    |  12| BB|
    +----+---+
    
    scala> a.na.fill("Anonymous", Seq("f1")).show
    +----+---+
    |  f1| f2|
    +----+---+
    |null| AA|
    |  12| BB|
    +----+---+
    

    工作示例 - 对所有数字使用Null:

    scala> a.show
    +----+---+
    |  f1| f2|
    +----+---+
    |null| AA|
    |  12| BB|
    +----+---+
    
    
    scala> a.na.fill(1, Seq("f1")).show
    +---+---+
    | f1| f2|
    +---+---+
    |  1| AA|
    | 12| BB|
    +---+---+
    

    失败示例(空字符串而不是空字符):

    scala> b.show
    +---+---+
    | f1| f2|
    +---+---+
    |   | AA|
    | 12| BB|
    +---+---+
    
    
    scala> b.na.fill(1, Seq("f1")).show
    +---+---+
    | f1| f2|
    +---+---+
    |   | AA|
    | 12| BB|
    +---+---+
    

    案例陈述修复示例:

    scala> b.show
    +---+---+
    | f1| f2|
    +---+---+
    |   | AA|
    | 12| BB|
    +---+---+
    
    
    scala> b.select(when(col("f1") === "", "Anonymous").otherwise(col("f1")).as("f1"), col("f2")).show
    +---------+---+
    |       f1| f2|
    +---------+---+
    |Anonymous| AA|
    |       12| BB|
    +---------+---+
    

答案 1 :(得分:2)

您也可以试试这个。 这可能会处理blank / empty / null

df.show()
+------+------+
|Field1|Field2|
+------+------+
|      |    AA|
|    12|    BB|
|    12|  null|
+------+------+

df.na.replace(Seq("Field1","Field2"),Map(""-> null)).na.fill("Anonymous", Seq("Field2","Field1")).show(false)   

+---------+---------+
|Field1   |Field2   |
+---------+---------+
|Anonymous|AA       |
|12       |BB       |
|12       |Anonymous|
+---------+---------+   

答案 2 :(得分:1)

当数据框中的列数为n时,您可以尝试使用以下代码。

注意:当您尝试将数据写入拼花地板等格式时,不支持空数据类型。我们必须键入强制转换。

val df = Seq(
(1, ""),
(2, "Ram"),
(3, "Sam"),
(4,"")
).toDF("ID", "Name")

// null type column

val inputDf = df.withColumn("NulType", lit(null).cast(StringType))

//Output

+---+----+-------+
| ID|Name|NulType|
+---+----+-------+
|  1|    |   null|
|  2| Ram|   null|
|  3| Sam|   null|
|  4|    |   null|
+---+----+-------+

//Replace all blank space in the dataframe with null

val colName = inputDf.columns //*This will give you array of string*

val data = inputDf.na.replace(colName,Map(""->"null"))

data.show()
+---+----+-------+
| ID|Name|NulType|
+---+----+-------+
|  1|null|   null|
|  2| Ram|   null|
|  3| Sam|   null|
|  4|null|   null|
+---+----+-------+