Spark数据帧替换scala中不同数据类型的空值



类似的问题在SO中有答案,但这个要求没有什么不同。Spark DataFrame Scala 中的na.fill

我有一个示例数据帧,如下所示。数据帧中的每一列都是不同的数据类型。因此,使用df.na.fill无法替换所有空值。

+-------------------------+-------------------------+-------------------------+
| date                    | id                      | name                    |
+-------------------------+-------------------------+-------------------------+
| 2000-01-01              | NULL                    | ABC                     |
| NULL                    | 123                     | NULL                    |
| NULL                    | NULL                    | CDE                     |
+-------------------------+-------------------------+-------------------------+

因此,不管列的数据类型如何,所有的NULL都应该用空字符串替换。数据帧中列的编号和名称将不断更改。

应根据输入数据帧数据类型替换NULL。

此数据帧的架构:

root
|-- date: timestamp (nullable = false)
|-- id: integer (nullable = true)
|-- points_redeemed: string (nullable = false)

预期结果:

+-------------------------+-------------------------+-------------------------+
| date                    | id                      | name                    |
+-------------------------+-------------------------+-------------------------+
| 2000-01-01              |                         | ABC                     |
|                         | 123                     |                         |
|                         |                         | CDE                     |
+-------------------------+-------------------------+-------------------------+

有人能提供建议吗?

在数据帧列上使用foldLeft,并检查值是否为literal NULL or .isNull or length(trim(col)) === 0,然后替换为",否则不要更改值。

Example:

import org.apache.spark.sql.functions._
import org.apache.spark.sql.types._
val df= Seq(("2000-01-01","NULL","ABC"),("NULL","123","NULL")).
toDF("date","id","name").
withColumn("date",col("date").cast("timestamp")).
withColumn("id",col("id").cast("int"))
df.printSchema
//root
// |-- date: timestamp (nullable = true)
// |-- id: integer (nullable = true)
// |-- name: string (nullable = true)
df.show()
//+--------------------+----+----+
//|                date|  id|name|
//+--------------------+----+----+
//|2000-01-01 00:00:...|null| ABC|
//|                null| 123|NULL|
//+--------------------+----+----+
#using when otherwise to determine NULL value and replacing with "" if matches.
val df2=df.columns.foldLeft(df)((df, c) => {
df.withColumn(s"$c",when((lower(col(s"$c")) === lit("null")) || (col(s"$c").isNull)|| (length(trim(col(s"$c"))) === 0),lit("")).otherwise(col(s"$c")))
})
df2.show()
//+-------------------+---+----+
//|               date| id|name|
//+-------------------+---+----+
//|2000-01-01 00:00:00|   | ABC|
//|                   |123|    |
//+-------------------+---+----+

如果需要,您还可以在when语句中添加更多检查!

最新更新