【问题标题】:How to convert pyspark dataframe to JSON?如何将 pyspark 数据帧转换为 JSON?
【发布时间】:2020-07-31 08:00:02
【问题描述】:

我有 pyspark 数据框,我想将其转换为包含 JSON 对象的列表。 为此,我已经完成了如下操作..

df.toJSON().collect()

但是这个操作向驱动程序发送数据是昂贵的并且需要很多时间来执行。而且我的数据帧包含数百万条记录。那么有没有比 collect() 优化的 collect() 操作的其他方法来做到这一点.

下面是我的数据框 df:-

      product cost
      pen      10
      book     40
      bottle   80
      glass    55

输出如下:-

df2 = [{product:'pen',cost:40},{product:'book',cost:40},{product:'bottle',cost:80},{product:'glass',cost:55}]

当我打印 df2 的数据类型时,它将是列表。

【问题讨论】:

    标签: pyspark pyspark-sql pyspark-dataframes


    【解决方案1】:

    如果您想在数据框中创建 json 对象,请使用 collect_list + create_map + to_json 函数。

    (or)

    要将json 文档写入文件,则不会使用to_json,而是使用.write.json()


    Create JSON object:

    df.agg(collect_list(create_map(lit("product"),"product",lit("cost"),"cost")).alias("stru")).\
    selectExpr("to_json(stru) as json").\
    show(10,False)
    
    #+-------------------------------------------------------------------------------------------------------------------------------+
    #|json                                                                                                                           |
    #+-------------------------------------------------------------------------------------------------------------------------------+
    #|[{"product":"pen","cost":"10"},{"product":"book","cost":"40"},{"product":"bottle","cost":"80"},{"product":"glass","cost":"55"}]|
    #+-------------------------------------------------------------------------------------------------------------------------------+
    
    
    #write to hdfs use .saveAsTextFile
    df.agg(collect_list(create_map(lit("product"),"product",lit("cost"),"cost")).alias("stru")).selectExpr("to_json(stru) as json").rdd.map(lambda x:x['json']).saveAsTextFile("<path>")
    
    #cat part-00000
    #[{"product":"pen","cost":"10"},{"product":"book","cost":"40"},{"product":"bottle","cost":"80"},{"product":"glass","cost":"55"}]
    

    Create JSON file:

    df.agg(collect_list(create_map(lit("product"),"product",lit("cost"),"cost")).alias("stru")).write.mode("overwrite").json("<path>")
    
    #cat part-00000-3a19165e-219e-4485-adb8-ef91589d6e31-c000.json
    #{"stru":[{"product":"pen","cost":"10"},{"product":"book","cost":"40"},{"product":"bottle","cost":"80"},{"product":"glass","cost":"55"}]}
    

    【讨论】:

    • 我已经尝试过了,但输出将是 pyspark 数据帧,但我不想要 pyspark 数据帧。我只想将 pyspark 数据框转换为包含 json 对象的列表,而不使用 collect 和 toJSON 函数.... @Shu
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-18
    • 2017-05-14
    • 1970-01-01
    相关资源
    最近更新 更多