Pyspark数据帧写入具有特定名称的单个json文件

时间:2017-04-07 03:41:44

标签: apache-spark pyspark

我有一个数据框,我想把它写成具有特定名称的单个json文件。我试过下面的

df2 = df1.select(df1.col1,df1.col2)
df2.write.format('json').save('/path/file_name.json') # didnt work, writing in folder 'file_name.json' and files with part-XXX
df2.toJSON().saveAsTextFile('/path/file_name.json')  # didnt work, writing in folder 'file_name.json' and files with part-XXX

感谢某人是否可以提供解决方案。

4 个答案:

答案 0 :(得分:12)

您需要使用以下代码将其保存在单个文件中: -

df2 = df1.select(df1.col1,df1.col2)
df2.coalesce(1).write.format('json').save('/path/file_name.json')

这将生成一个file_name.json的文件夹。检查此文件夹,您可以获得包含完整数据part-000

的单个文件

答案 1 :(得分:2)

您可以通过以下方式将其转换为熊猫df:

df.toPandas().to_json('path/file_name.json', orient='records', force_ascii=False, lines=True)

答案 2 :(得分:0)

Pyspark将文件存储在较小的块中,据我所知,我们无法使用单个给定的文件名直接存储JSON。我认为这个小的python函数将对您要实现的目标有所帮助。

def saveResult (data_frame, temp_location, file_path):
    data_frame.write.mode('append').json(temp_location)
    file = dbutils.fs.ls(temp_location)[-1].path # last file is the json or can also use regex to determine this
    dbutils.fs.cp(file, file_path)
    dbutils.fs.rm(temp_location, recurse=True)

基本上,这里发生的是传递数据帧,存储所有文件块的temp_location和要作为输出文件获取的完整文件路径(文件路径+文件名)。该函数生成块,删除所有块,并将最终文件与所需文件名一起保存到所需位置。

答案 3 :(得分:0)

这是另一种方法:

import os
df2 = df1.select(df1.col1,df1.col2)
df2.write.format('json').save('/path/folder_name')

os.system("cat /path/folder_name/*.json > /path/df.json")
os.system("rm -rf /path/folder_name")

假设这是在分析阶段完成的,并且作为单个json的导出不会进入产品。