Python 如何从PySpark中的多列创建字典列表,其中key是一个列名,value是该列';s值多少?
考虑一个示例数据帧,例如Python 如何从PySpark中的多列创建字典列表,其中key是一个列名,value是该列';s值多少?,python,apache-spark,dictionary,pyspark,apache-spark-sql,Python,Apache Spark,Dictionary,Pyspark,Apache Spark Sql,考虑一个示例数据帧,例如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 从这个数据框df,我想为每一行用户
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
从这个数据框df
,我想为每一行用户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\u id')
,然后使用某种形式的collect\u list
来获取字典列表。您可以在项目id->struct
的地图上使用collect\u list
:
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}}]|
+-------+-------------------------------------------------------------------------------------+