簡體   English   中英

將大型Spark數據框寫入CSV文件

[英]Writing a big Spark Dataframe into a csv file

我正在使用Spark 2.3,並且需要將Spark Dataframe保存到csv文件中,並且我正在尋找一種更好的方法來做..查看相關問題/類似問題,我發現了這個問題,但是我需要一個更具體的問題:

如果DataFrame太大,如何避免使用Pandas? 因為我曾經使用toCSV()函數(下面的代碼),所以產生了:

內存不足錯誤(無法分配內存)。

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

使用df.coalesce(1).write.option("header", "true").csv('mycsv.csv')將使標題寫入每個文件中,並且在合並文件時,它將具有標題在中間。 我錯了嗎?

從性能的角度來看,使用spark write然后hadoop getmerge優於使用合並嗎?

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)

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

您可以將文件保存到HDFS或S3或任何您擁有的分布式存儲中。

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

如果這樣做是為了將文件保存到本地存儲,這仍然會導致OOM異常,因為您需要將所有數據移動到本地計算機的內存中。

使用df.coalesce(1).write.option(“ header”,“ true”)。csv('mycsv.csv')將使標題寫入每個文件中,並且在合並文件時,它將具有標題在中間。 我錯了嗎?

在這種情況下,您只有1個文件(因為您進行了coalesce(1) )。 因此,您無需關心標題。 相反,您應該關心執行程序上的內存,因為所有數據都將移至該執行程序上,因此您可能會在執行程序上獲得OOM。

從性能的角度來看,使用spark寫入然后hadoop getmerge優於使用合並嗎?

絕對好(但不要使用coalesce() )。 Spark將有效地將數據寫入存儲,然后HDFS將復制數據,然后getmerge將能夠有效地從節點讀取數據並將其合並。

我們使用了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>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM