【问题标题】:WithColumn and nulls, Scala SparkWithColumn 和空值,Scala Spark
【发布时间】:2021-07-13 09:15:50
【问题描述】:

我尝试创建一个新列并将其与另一列进行比较,如果相等,我必须输入“是”否则“否”,如您在此处看到的:

+----+-------+-----------+----------+
|Game| statB | statPrev  |  Change  |
+----+-------+-----------+----------+
|  CA|   2   |     2     |   No     |
|  BL|   5   |     2     |   Yes    |
|  CD|  null |    null   |   No     |
|  NT|   4   |     5     |   Yes    |
|  FT|   6   |    null   |   Yes    |
+----+-------+-----------+----------+

我正在尝试的是:

var df1 = df.withColumn("Change",
    when($"statB" =!= $"statPrev" 
    || $"statPrev".isNull && $"statB".isNotNull 
    || $"statPrev".isNotNull && $"statB".isNotNull, "Yes").otherwise("No"))

但是例如当 StatB 和 statPrev 都是空值时,我得到一个“是”...我做错了什么?

【问题讨论】:

    标签: scala apache-spark


    【解决方案1】:

    如果 stateB 和 statePrev 等于:

     df.withColumn("Change", when($"stateB" === $"statePrev", lit("YES")).otherwise("NO")).show(false);
    

    输出

    +----+------+---------+---+
    |Game|stateB|statePrev|Change|
    +----+------+---------+---+
    |CA  |2     |2        |YES|
    |BL  |5     |2        |NO |
    |CD  |null  |null     |YES|
    |NT  |4     |5        |NO |
    |FT  |6     |null     |NO |
    +----+------+---------+---+
    

    如果你想告诉 No 如果 stateB 和 statePrev 上的 null 值 -

    df.withColumn("Change",
        when(($"stateB" === $"statePrev") && ($"stateB".notEqual( "null")
          && $"statePrev".notEqual( "null")),
        lit("YES")).otherwise("NO")).show(false)
    

    输出

    +----+------+---------+------+
    |Game|stateB|statePrev|Change|
    +----+------+---------+------+
    |CA  |2     |2        |YES   |
    |BL  |5     |2        |NO    |
    |CD  |null  |null     |NO    |
    |NT  |4     |5        |NO    |
    |FT  |6     |null     |NO    |
    +----+------+---------+------+
    

    【讨论】:

      【解决方案2】:

      根据您的问题,如果相等,我必须输入“是”否则“否”

      应该是

      var df1 = df.withColumn("Change1",
        when($"statB" === $"statPrev" || ($"statB".isNull && $"statPrev".isNull),
          "Yes").otherwise("No"))
      
      df1.show(false)
      

      或者您可以使用 null 安全等号运算符作为

      df.withColumn("Change1",
        when(($"statB" <=> $"statPrev" ), "Yes").otherwise("No"))
        .show(false)
      

      结果:

      +----+-----+--------+------+
      |Game|statB|statPrev|Change|
      +----+-----+--------+------+
      |CA  |2    |2       |Yes   |
      |BL  |5    |2       |No    |
      |CD  |null |null    |Yes   |
      |NT  |4    |5       |No    |
      |FT  |6    |null    |No    |
      +----+-----+--------+------+
      

      【讨论】:

        【解决方案3】:

        要将相等性与空值进行比较,您可以使用eqNullSafe 以获得更简单的语法:

        val df2 = df.withColumn(
            "Change", 
            when($"statB".eqNullSafe($"statPrev"), "Yes").otherwise("No")
        )
        
        df2.show
        +----+-----+--------+------+
        |Game|statB|statPrev|Change|
        +----+-----+--------+------+
        |  CA|    2|       2|   Yes|
        |  BL|    5|       2|    No|
        |  CD| null|    null|   Yes|
        |  NT|    4|       5|    No|
        |  FT|    6|    null|    No|
        +----+-----+--------+------+
        

        【讨论】:

        • 嗨,麦克!你把它倒了^^
        • 你不是说“如果相等我必须写“是”吗?
        猜你喜欢
        • 2018-12-26
        • 1970-01-01
        • 2021-11-09
        • 2019-03-20
        • 2020-10-04
        • 1970-01-01
        • 2018-06-18
        • 1970-01-01
        • 2020-05-04
        相关资源
        最近更新 更多