将一个大的Spark Dataframe写入csv文件

时间:2018-06-06 08:02:04

标签: python pandas csv apache-spark

我使用Spark 2.3,我需要将Spark Dataframe保存到csv文件中,我正在寻找更好的方法来查看相关/类似问题,我发现{{ 3}},但我需要一个更具体的:

如果DataFrame太大,我该如何避免使用Pandas?因为我使用了ALTER DEFAULT PRIVILEGES FOR ROLE migrator GRANT ALL PRIVILEGES ON TABLES TO PUBLIC 函数(下面的代码)并且它产生了:

  

Out Of Memory错误(无法分配内存)。

使用文件I / O直接写入csv更好吗?它能保留分离器吗?

使用toCSV()将导致在每个文件中写入标题,并且在合并文件时,它将在中间包含标题。我错了吗?

使用spark df.coalesce(1).write.option("header", "true").csv('mycsv.csv')然后hadoop write比从性能角度使用coalesce更好?

getmerge

2 个答案:

答案 0 :(得分:0)

  

如果DataFrame太大,我该如何避免使用Pandas?

您只需将文件保存到HDFS或S3或您拥有的任何分布式存储。

  

使用文件I / O直接写入csv更好吗?它可以   保留分隔符?

如果您的意思是将文件保存到本地存储 - 它仍然会导致OOM异常,因为您需要将本地计算机内存中的所有数据移动来执行此操作。

  

使用df.coalesce(1).write.option(“header”,“true”)。csv('mycsv.csv')   将导致标题写入每个文件和文件时   合并后,它将在中间有标题。我错了吗?

在这种情况下,您将只有一个文件(因为您执行coalesce(1))。所以你不需要关心标题。相反 - 您应该关心执行程序的内存 - 您可能会在执行程序上获得OOM,因为所有数据都将被移动到该执行程序。

  

使用spark write然后hadoop getmerge比使用更好   从表现的角度来凝聚?

绝对更好(但不要使用coalesce())。 Spark将有效地将数据写入存储,然后HDFS将复制数据,之后getmerge将能够有效地从节点读取数据并将其合并。

答案 1 :(得分:0)

我们使用了数据库库。它工作正常

df.save("com.databricks.spark.csv", SaveMode.Overwrite, Map("delimiter" -> delim, "nullValue" -> "-", "path" -> tempFPath))

图书馆:

<!-- spark df to csv -->
    <dependency>
        <groupId>com.databricks</groupId>
        <artifactId>spark-csv_2.10</artifactId>
        <version>1.3.0</version>
    </dependency>