Scala - Условная замена значения столбца фрейма данных - PullRequest
0 голосов
/ 28 августа 2018

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)))

Как мне решить это? И если есть какие-то другие лучшие способы сделать то же самое, я открыт для этого. Заранее спасибо

1 Ответ

0 голосов
/ 28 августа 2018

В одну сторону, используя 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      |
+-----+---------------------------+  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...