我有一个数据框,我想把它写成具有特定名称的单个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
感谢某人是否可以提供解决方案。
答案 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的导出不会进入产品。