我使用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
答案 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>