【问题标题】:Convert dataframe into array of nested json object in pyspark将数据框转换为pyspark中的嵌套json对象数组
【发布时间】:2018-12-10 11:11:38
【问题描述】:

我创建了如下数据框:

+----+-------+-------+
| age| number|name   |
+----+-------+-------+
|  16|     12|A      |
|  16|     13|B      |
|  17|     16|E      |
|  17|     17|F      |
+----+-------+-------+

如何转换成如下的json:

{ 
'age' : 16,  
'values' : [{‘number’: ‘12’ , ‘name’ : 'A'},{‘number’: ‘12’ , ‘name’ : 'A'} ] 
},{ 
'age' : 17,  
'values' : [{‘number’: ‘16’ , ‘name’ : 'E'},{‘number’: ‘17’ , ‘name’ : 'F'} ] 
}

【问题讨论】:

    标签: apache-spark pyspark


    【解决方案1】:

    假设 df 是您的数据框,

    from pyspark.sql import functions as F
    
    new_df = df.select(
        "age",
        F.struct(
            F.col("number"),
            F.col("name"),
        ).alias("values")
    ).groupBy(
        "age"
    ).agg(
        F.collect_list("values").alias("values")
    )
    
    new_df.toJSON()
    # or
    new_df.write.json(...)
    

    【讨论】:

      【解决方案2】:

      您可以将 DF 转换为 RDD 并应用您的转换:

      NewSchema = StructType([StructField("age", IntegerType())
                                 , StructField("values", StringType())
                              ])
      
      
      res_df = df.rdd.map(lambda row: (row[0], ([{'number':row[1], 'name':row[2]}])))\
          .reduceByKey(lambda x, y: x + y)\
          .map(lambda row: (row[0], json.dumps(row[1])))\
          .toDF(NewSchema)
      
      res_df.show(20, False)
      

      显示 res_df:

      +---+------------------------------------------------------------+
      |age|values                                                      |
      +---+------------------------------------------------------------+
      |16 |[{"number": 12, "name": "A"}, [{"number": 13, "name": "B"}] |
      |17 |[{"number": 17, "name": "F"}, [{"number": 16, "name": "E"}] |
      +---+------------------------------------------------------------+
      

      将 DF 保存为 JSON 文件:

      res_df.coalesce(1).write.format('json').save('output.json')
      

      【讨论】:

      • 将 DF 转换为 RDD 再转换回 DF 确实会影响性能
      • @Steven 也许,但我怀疑它是否真的会影响性能,因为在每个 DF 的背景中都有 RDD!
      猜你喜欢
      • 2021-06-12
      • 1970-01-01
      • 2021-11-18
      • 2021-12-21
      • 1970-01-01
      • 1970-01-01
      • 2019-07-08
      • 2019-03-28
      相关资源
      最近更新 更多