簡體   English   中英

覆蓋特定的 CSV 分區 pyspark

[英]Overwrite specific CSV partitions pyspark

我有一個名為df的 spark dataframe,它在列date上分區。 我需要使用 CSV 格式在 S3 上保存這個 dataframe。 當我寫入 dataframe 時,我需要刪除 S3 上 dataframe 有數據要寫入的分區(即日期)。 所有其他分區都需要保持不變。

我在這里看到,這正是選項spark.sql.sources.partitionoverwritemode設置為dynamic的工作。

但是,它似乎不適用於 CSV 個文件。
如果我使用以下命令在鑲木地板上使用它,它會完美運行:

df.write
.option("partitionOverwriteMode", "dynamic")
.partitionBy("date")
.format("parquet")
.mode("overwrite")
.save(output_dir)

但是,如果我使用以下命令在 CSV 上使用它,則它不起作用:

df.write
.option("partitionOverwriteMode", "dynamic")
.partitionBy("date")
.format("csv")
.mode("overwrite")
.save(output_dir)

為什么會這樣? 知道如何使用 CSV 輸出實現這種行為嗎?

我需要刪除 S3 上的分區(即日期),其中 dataframe 有數據要寫入

假設您有一個方便的日期列表,您可以使用replaceWhere選項來確定要覆蓋的分區(刪除和替換)。

例如:

df.write
.partitionBy("date")
.option("replaceWhere", "date >= '2020-12-14' AND date <= '2020-12-15'")
.format("csv")
.mode("overwrite")
.save(output_dir)

一種更動態的方法是將start_dateend_date存儲在變量中:

start_date = "2022-01-01"
end_date = "2022-01-14"

condition = f"date >= '{start_date}' AND date <= '{end_date}'"

df.write
.partitionBy("date")
.option("replaceWhere", condition)
.format("csv")
.mode("overwrite")
.save(output_dir)

您使用什么 Spark 版本? 對於 Spark <2.0.0,使用分區和 csv 格式似乎是不可能的

如果您不在 EMR 上,並且正在使用 s3a 提交者安全地將工作提交到 s3,那么可以將分區提交者設置為在提交新工作之前刪除目標分區中的所有數據,而不會影響所有其他分區。

暫無
暫無

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

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