如何使用单列向前填充PySpark数据帧的缺失值插补?

时间:2017-06-06 10:45:00

标签: python apache-spark pyspark apache-spark-sql pyspark-sql

我有一个带有单列的PySpark数据框。

| Rank  
|----------
| 10
| 10
| null   
| null     
| 15
| null
| 20
| null     
| null     
| 15
| null   
| 10

我想使用pandas ffill()函数等前向填充来估算缺失值。

所需的输出

| Rank    
|----------
| 10
| 10
| 10   
| 10     
| 15
| 15
| 20
| 20     
| 20     
| 15
| 15   
| 10

免责声明:我在stackoverflow中有一些解决方案但是当你只有一个列作为输入时它们不会工作。

1 个答案:

答案 0 :(得分:1)

请查看spark中的laglead功能。

lag和lead仅用于获取一个偏移量。使用全局变量简单地创建udf应该可以解决问题 下面是简单的例子

var PRV_RANK = 0f

import spark.implicits._
val data = spark.sparkContext.parallelize(Seq(10f, 10f, Float.NaN, Float.NaN, 15f, Float.NaN, 20f, Float.NaN, Float.NaN, 15f, Float.NaN, 10f))
  .toDF("rank")

val forwardFill = udf((rank: Float) =>
{
  if (rank == null || rank.equals(Float.NaN)){
    PRV_RANK
  }
  else {
    PRV_RANK = rank
    rank
  }
})

data.withColumn("rankNew", forwardFill($"rank")).show()

希望这有帮助!