Заполните пустые строки в столбце с непустым значением над ним в Spark - PullRequest
0 голосов
/ 05 мая 2020

У меня есть входной файл, содержащий около 8,5 миллионов записей. Мое требование - заполнить пустые значения строк в столбце немедленным непустым значением ABOVE it. Взгляните на пример:

Have a look at the example:


+-----+-----+---+------+
|FName|LName|Age|Gender|
+-----+-----+---+------+
|    A|    B| 29|     M|
|    A|    C| 12|      |
|    B|    D| 35|      |
|    Q|    D| 85|     F|
|    W|    R| 14|      |
+-----+-----+---+------+


Desired Ouput:

+-----+-----+---+------+
|FName|LName|Age|Gender|
+-----+-----+---+------+
|    A|    B| 29|     M|
|    A|    C| 12|     M|
|    B|    D| 35|     M|
|    Q|    D| 85|     F|
|    W|    R| 14|     F|
+-----+-----+---+------+

Ответы [ 2 ]

3 голосов
/ 05 мая 2020

Может быть добавлен столбец с приращением, а функция «последний» с игнорированием нулей может использоваться над окном:

val idWindow = Window.orderBy($"ID")
df
  .withColumn("id", monotonically_increasing_id())
  .withColumn("Gender",
    last(
      when($"Gender" === "", null).otherwise($"Gender"),
      ignoreNulls = true).over(idWindow)
  )
  .drop("id")
0 голосов
/ 05 мая 2020

Добавьте столбец rowId с Gender_temp и пометьте четный нечетный столбец как M и F, сохраните его в Gender_temp и удалите неиспользуемые столбцы

import org.apache.spark.sql.functions._

object DataframeFill {

  def main(args: Array[String]): Unit = {

    val spark = Constant.getSparkSess
    import spark.implicits._

    val personDF = Seq(("A", "B", 29, "M"),
      ("A", "C", 12, ""),
      ("B", "D", 35, "F"),
      ("Q", "D", 85, ""),
      ("W", "R", 14, "")).toDF("FName", "LName", "Age", "Gender")

    personDF.show()

    personDF
    .withColumn("rowId", monotonically_increasing_id())
      .withColumn("Gender_temp", when($"Gender".isin(""),
      when ($"rowId" % 2 ===0 ,"M").otherwise("F") ).otherwise($"Gender"))
      .drop("Gender")
      .drop("rowId")
      .withColumnRenamed("Gender_temp","Gender")
          .show()


  }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...