【问题标题】:How to create list of dictionaries from multiple columns in PySpark where key is a column name and value is that column's value?如何从 PySpark 中的多个列创建字典列表,其中键是列名,值是该列的值?
【发布时间】:2021-03-24 19:14:32
【问题描述】:

考虑一个示例数据框,比如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,我想在一行中为每个user_id 收集所有items 及其属性item_paramX,因此输出将是:

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 来获取字典列表。

【问题讨论】:

    标签: python apache-spark dictionary pyspark apache-spark-sql


    【解决方案1】:

    你可以在item_id -> struct的地图上使用collect_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}}]|
    +-------+-------------------------------------------------------------------------------------+
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-05-14
      • 2021-12-29
      • 2014-10-08
      • 2019-09-25
      • 1970-01-01
      • 2021-06-08
      • 2018-01-14
      • 1970-01-01
      相关资源
      最近更新 更多