当前位置: 首页 > 知识库问答 >
问题:

将big Spark数据帧写入csv文件

苍嘉澍
2023-03-14

我正在使用Spark 2.3,我需要将Spark数据帧保存到csv文件中,我正在寻找更好的方法。。查看相关/类似的问题,我发现了这个问题,但我需要一个更具体的:

如果DataFrame太大,如何避免使用Pandas?因为我使用了toCSV()函数(下面的代码),它产生了:

内存不足错误(无法分配内存)。

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

使用df。聚结(1)。写选项(“标题”、“true”)。csv('mycsv.csv')将导致在每个文件中写入标题,当文件合并时,标题将位于中间在中间。我错了吗?

性能角度来看,使用spark编写hadoop和getmerge比使用coalesce更好?

def toCSV(spark_df, n=None, save_csv=None, csv_sep=',', csv_quote='"'):
        """get spark_df from hadoop and save to a csv file

        Parameters
        ----------
        spark_df: incoming dataframe
        n: number of rows to get
        save_csv=None: filename for exported csv

        Returns
        -------

        """

        # use the more robust method
        # set temp names
        tmpfilename = save_csv or (wfu.random_filename() + '.csv')
        tmpfoldername = wfu.random_filename()
        print n
        # write sparkdf to hadoop, get n rows if specified
        if n:
            spark_df.limit(n).write.csv(tmpfoldername, sep=csv_sep, quote=csv_quote)
        else:
            spark_df.write.csv(tmpfoldername, sep=csv_sep, quote=csv_quote)

        # get merge file from hadoop
        HDFSUtil.getmerge(tmpfoldername, tmpfilename)
        HDFSUtil.rmdir(tmpfoldername)

        # read into pandas df, remove tmp csv file
        pd_df = pd.read_csv(tmpfilename, names=spark_df.columns, sep=csv_sep, quotechar=csv_quote)
        os.remove(tmpfilename)

        # re-write the csv file with header!
        if save_csv is not None:
            pd_df.to_csv(save_csv, sep=csv_sep, quotechar=csv_quote)

共有2个答案

隗高旻
2023-03-14

我们使用了databricks库。很好用

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>
郁高韵
2023-03-14

如果数据框太大,如何避免使用熊猫?

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

使用文件I/O直接写入csv是更好的方法吗?它能保存分离器吗?

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

使用df。聚结(1)。写选项(“标题”、“true”)。csv('mycsv.csv')将导致在每个文件中写入标题,并且当文件合并时,标题将在中间。我错了吗?

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

从性能的角度来看,使用火花写入然后使用hadoop getmer比使用合并更好?

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

 类似资料:
  • 我在pandas中有一个数据帧,我想把它写到CSV文件中。我使用的是: 并得到错误: 有没有什么方法可以很容易地解决这个问题(例如,我的数据帧中有unicode字符)?还有,有没有一种方法可以使用“to-tab”方法(我认为不存在)写入以制表符分隔的文件,而不是CSV?

  • 问题内容: 如何将大数据文件分块写入CSV文件? 我有一组大型数据文件(1M行x 20列)。但是,我只关注该数据的5列左右。 我想通过只用感兴趣的列制作这些文件的副本来使事情变得更容易,所以我可以使用较小的文件进行后期处理。因此,我计划将文件读取到数据帧中,然后写入csv文件。 我一直在研究将大数据文件以块的形式读入数据框。但是,我还无法找到有关如何将数据分块写入csv文件的任何信息。 这是我现在

  • 我想将一个数据帧保存到两个不同的csv文件中(拆分数据帧)-一个文件只包含标题,另一个文件包含其余行。 我想将这两个文件保存在同一个目录下,这样Spark处理所有逻辑将是最好的选择,如果可能的话,而不是使用pandas分割csv文件。 最有效的方法是什么? 谢谢你的帮助!

  • 我正在尝试使用Databricks的spark-csv2.10依赖关系将一个数据帧写入到HDFS的*.csv文件。依赖关系似乎可以正常工作,因为我可以将.csv文件读入数据帧。但是当我执行写操作时,我会得到以下错误。将头写入文件后会出现异常。 当我将查询更改为时,write工作很好。 有谁能帮我一下吗? 编辑:根据Chandan的请求,这里是的结果

  • Python是如何将CSV文件读入pandas数据帧的(我可以使用它进行统计操作,可以有不同类型的列,等等)? 我的CSV文件有以下内容: 在R中,我们将使用以下方法读取此文件: 这将返回一个R数据。框架: 有没有类似python的方法来获得相同的功能?

  • 我正在编写一个脚本,将带有标头的大. xlsx文件减少到CSV中,然后根据标头名称编写一个新的CSV文件,其中仅包含所需的列。 我得到的错误是最后一段代码,它说 我肯定我忽略了一些愚蠢的东西,但是我已经阅读了熊猫网站上的留档,我仍然不知所措。我知道我误用了to_csv参数,但我似乎无法理解留档。 任何帮助都是赞赏的,谢谢!