Рассмотрим пример фрейма данных, скажем df: user_id | item_id | item_param1 | item_param2 | 1 а 10 20 1 б 30 40 2 б 50 ...

0
exAres 24 Мар 2021 в 22:14

1 ответ

Лучший ответ

Вы можете использовать collect_list на карте item_id -> struct:

import pyspark.sql.functions as F

df2 = df.groupBy('user_id').agg(
    F.to_json(
        F.collect_list(
            F.create_map(
                'item_id', 
                F.struct('item_param1', 'item_param2')
            )
        )
    ).alias('values')
)

df2.show(truncate=False)
+-------+-------------------------------------------------------------------------------------+
|user_id|values                                                                               |
+-------+-------------------------------------------------------------------------------------+
|1      |[{"a":{"item_param1":10,"item_param2":20}},{"b":{"item_param1":30,"item_param2":40}}]|
|2      |[{"b":{"item_param1":50,"item_param2":60}},{"c":{"item_param1":70,"item_param2":80}}]|
+-------+-------------------------------------------------------------------------------------+
1
mck 24 Мар 2021 в 19:21