【问题标题】:Replace null in a column of a dataframe with other value [duplicate]用其他值替换数据框列中的 null [重复]
【发布时间】:2018-02-09 17:17:56
【问题描述】:

我有一个Dataset,如下所示

monthYear    code
201601       11
201601       12
201601       12
201601       10
201602       null
201602       21
201602       21
201602       21
201603       null

codenull 时,我想用上个月出现最多的code 替换它。对于上面的示例,第一个 null 将替换为 12,第二个将替换为 21

所以结果如下。

monthYear    code
201601       11
201601       12
201601       12
201601       10
201602       12
201602       21
201602       21
201602       21
201603       21

我怎样才能做到这一点?

【问题讨论】:

    标签: scala apache-spark spark-dataframe


    【解决方案1】:

    可以使用Class DataFrameNaFunctionshttps://spark.apache.org/docs/2.1.0/api/java/org/apache/spark/sql/DataFrameNaFunctions.html#fill(double)的填充变换

    在哪里替换数据帧中的 null 或 NaN 值

    例子

    val df = spark.read.json("../test.json")
    df: org.apache.spark.sql.DataFrame = [age: bigint, name: string]
    
    scala> df.show
    +----+----+
    | age|name|
    +----+----+
    |  12| xyz|
    |null| abc|
    +----+----+
    
    df.na.fill(0, Seq("age"))
    
    res3.show
    +---+----+
    |age|name|
    +---+----+
    | 12| xyz|
    |  0| abc|
    +---+----+
    

    同样,如果你想替换该列的值

    res3.na.replace("age",Map(0 -> 51))

    但同样它不会用不同的值替换你必须在源端做一些事情

    【讨论】:

      【解决方案2】:

      您需要使用窗口函数找到最大值并合并以获得您想要的。

      让我们假设 df 是一个数据框(变量),其中包含您显示的表格,

      df = df.selectExpr("*","count(code) over (partition by monthYear) as code_count")
      df = df.selectExpr("*","rank(code) over (partition by monthYear order by code_count) as max_code")
      df = df.selectExpr("*","coalesce(code,max_code) as code_new")
      

      会给你你想要的。

      【讨论】:

        猜你喜欢
        • 2014-02-06
        • 1970-01-01
        • 1970-01-01
        • 2016-08-18
        • 1970-01-01
        • 1970-01-01
        • 2023-01-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多