Как агрегировать значения в список карт после группировки по? - PullRequest
1 голос
/ 27 мая 2020

У меня есть таблица типа

id  | fruit  | buy_time
------------------------
1   | apple  | 100
1   | banana | 105        
2   | grapes | 102
2   | orange | 101
2   | apple | 110

Мой ожидаемый результат (список групп карт по идентификатору)

id  | buy_info
------------------------
1   | [{"fruit": "apple", "time": 100}, {"fruit": "banana", "time": 105}]
2   | [{"fruit": "orange", "time": 101}, {"fruit": "grapes", "time": 102}, {"fruit": "apple", "time": 110}]

1 Ответ

2 голосов
/ 27 мая 2020

Используйте .groupBy с функциями to_json (Spark-2.4+) + collect_list +struct.

Example:

import org.apache.spark.sql.functions._
val df=Seq((1,"apple",100),(1,"banana",105),(2,"grapes",102),(2,"orange",101),(2,"apple",101)).toDF("id","fruit","buy_time")

df.groupBy("id").agg(to_json(collect_list(struct(col("fruit"),col("buy_time").alias("time")))).alias("buy_info")).show(10,false)
//+---+------------------------------------------------------------------------------------------+
//|id |buy_info                                                                                  |
//+---+------------------------------------------------------------------------------------------+
//|1  |[{"fruit":"apple","time":100},{"fruit":"banana","time":105}]                              |
//|2  |[{"fruit":"grapes","time":102},{"fruit":"orange","time":101},{"fruit":"apple","time":101}]|
//+---+------------------------------------------------------------------------------------------+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...