【问题标题】:Scala — Conditional replace column value of a data frameScala — 有条件地替换数据框的列值
【发布时间】:2018-08-30 22:05:40
【问题描述】:

DF1 是我现在拥有的,我想让 DF1 看起来像 DF2。

期望的输出:

 DF1                                DF2
+---------+-------------------+          +---------+------------------------------+
|   ID    | Category          |          |   ID    | Category                     |
+---------+-------------------+          +---------+------------------------------+  
|  31898  |   Transfer        |          |  31898  |  Transfer (e-Transfer)       |  
|  31898  |  e-Transfer       |  =====>  |  32614  |  Transfer (e-Transfer + IMT) |
|  32614  |   Transfer        |  =====>  |  33987  |   Transfer (IMT)             |
|  32614  |  e-Transfer + IMT |          +---------+------------------------------+      
|  33987  |   Transfer        |  
|  33987  |    IMT            |  
+---------+-------------------+

代码:

val df = DF1.groupBy("ID").agg(collect_set("Category").as("CategorySet"))
val DF2 = df.withColumn("Category", $"CategorySet"(0) ($"CategorySet"(1)))

我应该如何解决这个问题?如果还有其他更好的方法来做同样的事情,我愿意接受。提前谢谢你

【问题讨论】:

    标签: scala apache-spark dataframe


    【解决方案1】:

    使用 UDF 的一种方式:

    val flatten = udf((xs: Seq[String]) => xs.mkString(" + "))
    
    df.groupBy("ID").agg(flatten(collect_set("Category")).as("CategorySet")).show(false)
    
    +-----+---------------------------+
    |ID   |CategorySet                |
    +-----+---------------------------+
    |33987|Transfer                   |
    |32614|Transfer + e-Transfer + IMT|
    |34193|e-Transfer                 |
    |31898|Transfer + e-Transfer      |
    +-----+---------------------------+
    

    另一种方法是只使用concat_ws

    df.groupBy("ID").agg(concat_ws(" + ",collect_set("Category")).as("CategorySet")).show(false)
    
    +-----+---------------------------+
    |ID   |CategorySet                |
    +-----+---------------------------+
    |33987|Transfer                   |
    |32614|Transfer + e-Transfer + IMT|
    |34193|e-Transfer                 |
    |31898|Transfer + e-Transfer      |
    +-----+---------------------------+  
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-15
      • 1970-01-01
      • 2020-03-14
      • 2020-03-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多