如何从pyspark中的多列创建字典列表,其中key是列名,value是该列的值?

5fjcxozz  于 2021-07-09  发布在  Spark
关注(0)|答案(1)|浏览(314)

例如,考虑一个Dataframe示例 df :

user_id | item_id | item_param1 | item_param2 |
  1          a           10            20
  1          b           30            40
  2          b           50            60
  2          c           70            80

从这个Dataframe df ,我想收集所有 items 以及它们的性质 item_paramXuser_id 在一行中,因此输出为:

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}}]

我需要使用 groupBy('user_id') 然后是某种形式的 collect_list 去查字典。

sf6xfgos

sf6xfgos1#

你可以用 collect_list 在Map上 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}}]|
+-------+-------------------------------------------------------------------------------------+

相关问题