簡體   English   中英

Databricks - 即使指定為 CSV 文件,也將 CSV 寫入 Parquet 文件夾

[英]Databricks - Writing CSV as a Parquet folder even when specified as a CSV file

我有一些代碼執行一些 ETL,這些代碼在 Databricks 上運行得非常好。 但是,我有一位同事想要 CSV 格式的數據,以便他們可以將信息提取到本地 SQL 數據庫中。

目前我像這樣在 Parquet 中寫出所有數據

filelocation = f"/mnt/successfactors-work/{dimname}/{year}/{year}{month}/{dimname}_{year}{month}{day}.parquet"
df.write.mode("overwrite").parquet(filelocation)

這一切都工作得很好,在這下面我寫了如下代碼:

df.write.format("csv").mode("overwrite").save(f"/mnt/successfactors-work/{dimname}/{dimname}.csv")

然而,似乎發生的不是寫入單個 CSV 文件,而是寫入文件夾中的多個文件,我認為這是因為 Databricks/Spark 的分布式處理特性? 是這樣嗎? 有沒有辦法讓它寫成一個單一的 CSV?

可以獲得單個 CSV,但是我必須在 databricks 中運行數據,然后使用 UI 執行 df.display() 並使用圖標下載 - 這並不理想。

建議將不勝感激。

  • 使用 Pyspark DataFrame.write()始終會創建一個文件夾,其中包含所需的文件。 您的數據(如果很大)通常會重新分區並作為多個文件寫入此文件夾中,這些文件稱為part files

  • 因此,要將數據作為單個文件寫入此文件夾中,您可以使用DataFrame.repartition()DataFrame.coalesce() 這些方法有助於將數據幀寫入N個零件文件,其中N作為參數傳遞給上述方法。

  • 因此,您可以將代碼更改為以下內容:

df.repartition(1).write.format("csv").mode("overwrite").save(f"/mnt/successfactors-work/{dimname}/{dimname}.csv")

注意:如果您不想將文件寫入文件夾,則必須使用 pandas 數據框而不是 pyspark 來寫入。 您可以嘗試使用以下代碼:

pandas_df = df.toPandas()

pandas_df.to_csv(f"/dbfs/mnt/successfactors-work/{dimname}/{dimname}.csv", mode='w', index=False)

暫無
暫無

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

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