【问题标题】:How to use specific UDF to restore column values?如何使用特定的 UDF 来恢复列值?
【发布时间】:2019-08-14 10:30:11
【问题描述】:

我有一个如下的数据框:

+---------+--------+-------+
|date     |id      |typ_mvt|
+---------+--------+-------+
|date_1   |5697    |C      |
|date_2   |5697    |M      |
|date_3   |NULL    |M      |
|date_4   |NULL    |S      |
+---------+--------+-------+

我想恢复 id (NULL) 值如下:

+---------+--------+-------+
|date     |id      |typ_mvt|
+---------+--------+-------+
|date_1   |5697    |C      |
|date_2   |5697    |M      |
|date_3   |5697    |M      |
|date_4   |5697    |S      |
+---------+--------+-------+

有没有办法做到这一点?

感谢您的回答。

【问题讨论】:

  • 你需要更具体的要求,ID是不是一直不变的,是不是每列有空就填5697?
  • 次要问题:您为什么特别想要基于 UDF 的解决方案?这是您的要求,还是您可以采取任何其他方式?

标签: scala dataframe apache-spark


【解决方案1】:

Bonjour 文档, Le na.fill fait bien le taff :

val rdd = sc.parallelize(Seq(
(201901, new Integer(5697), "C"),
(201902, new Integer(5697), "M"),
(201903, null.asInstanceOf[Integer], "M"),
(201904, null.asInstanceOf[Integer], "S")
))

val df = rdd.toDF("date", "id", "typ_mvt")

import org.apache.spark.sql.functions.{lag,lead}
val window = org.apache.spark.sql.expressions.Window.orderBy("date") 
val sampleId = df.filter($"id".isNotNull).select($"id").first.getInt(0)
val newDf = df.na.fill(sampleId,Seq("id"))

Sinon, j'ai trouvé le post suivant très similaire avec une bien meilleur 解决方案: Fill in null with previously known good value with pyspark

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-07
    • 1970-01-01
    • 2021-01-14
    • 2017-06-15
    • 2018-06-05
    • 2021-05-18
    相关资源
    最近更新 更多