在Pyspark中将DataFrame保存为JSON文件到本地驱动器上

6

我有一个数据框,想要使用pyspark 1.4将其保存为JSON文件,但是好像并不起作用。当我给出目录路径时,它会返回一个错误,指出该路径已存在。根据文档,我的假设是它会将JSON文件保存在您提供的路径中。

df.write.json("C:\Users\username")

指定一个名称的目录不会产生任何文件,并给出“java.io.IOException: Mkdirs failed to create file:/C:Users/username/test/_temporary/....etc”的错误。但是,它确实创建了一个名为test的目录,其中包含几个带有空crc文件的子目录。
df.write.json("C:\Users\username\test")

添加JSON文件扩展名会产生相同的错误

df.write.json("C:\Users\username\test.JSON")

1
我认为你需要提供完整的文件名,而不仅仅是目录。 - Brobin
1
是的,我验证了该目录的权限,并使用 Python 中的 getpass.getuser() 验证我通过控制台作为该用户登录。 - Jared
1
尝试另一种方法,例如df.toJSON().saveAsTextFile(path)。 - urug
1
当我在Windows上使用时,我也遇到了这样的问题。所以我转换到Linux,同样的代码在那里完美地工作了... - Kavindu Dodanduwa
1
谢谢你尝试了一下。我猜这与Windows有关,唉... - Jared
显示剩余4条评论
3个回答

4

你能不能只是使用

df.toJSON()

此处所示,如果没有提供将DataFrame转换为Pandas DataFrame后再写入JSON。

pandas_df = df.toPandas()
pandas_df.to_json("C:\Users\username\test.JSON")

1
df.toJSON() 似乎不接受数组,但如果我传递单行数据它可以工作。我正在尝试进一步调试此问题。 - Jared
1
将数据转换为Pandas dataframe非常完美,除非在处理更大的数据集时出现内存或处理问题,否则我可能会一直使用Pandas dataframe。 - Jared
是的,我尽可能经常使用数据框架。如果内存成为问题,请查看Dask - Wesley Bowman

3

在处理大数据时,不建议将pyspark dataframe转换为pandas。您可以使用以下命令将json文件保存在输出目录中。这里的df是pyspark.sql.dataframe.DataFrame。集群会在输出目录中生成分块文件。

命令如下:
df.coalesce(1).write.format('json').save('/your_path/output_directory')

1
我建议避免使用write.json,因为它在Windows上会导致问题。使用Python的文件写入功能可以跳过创建临时目录,从而避免出现问题。
with open("C:\\Users\\username\\test.json", "w+") as output_file:
    output_file.write(df.toJSON())

如果我使用output_file.write(df.toJSON()),它会产生TypeError: expected character buffer object的错误,我猜测它传递了一个数组,这导致了失败,因为如果我使用output_file.write(df.toJSON().first()),它将成功创建只有一行的JSON文件。 - Jared
太好了!我在我的答案中添加了转义斜杠。 - Brobin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接