[英]Overwrite only some partitions in a partitioned spark Dataset
我們如何覆蓋分區數據集,但只覆蓋我們要更改的分區? 比如重新計算上周的日常作業,只覆蓋上周的數據。
默認的 Spark 行為是覆蓋整個表,即使只有一些分區將被寫入。
從 Spark 2.3.0 開始,這是覆蓋表時的一個選項。 要覆蓋它,您需要將新的spark.sql.sources.partitionOverwriteMode
設置設置為dynamic
,需要對數據集進行分區,並且寫入模式overwrite
。 Scala 中的示例:
spark.conf.set(
"spark.sql.sources.partitionOverwriteMode", "dynamic"
)
data.write.mode("overwrite").insertInto("partitioned_table")
我建議在寫入之前根據您的分區列進行重新分區,這樣每個文件夾最終不會有 400 個文件。
在 Spark 2.3.0 之前,最好的解決方案是啟動 SQL 語句刪除這些分區,然后使用模式追加寫入它們。
僅供參考,對於 PySpark 用戶,請確保在insertInto
設置overwrite=True
否則模式將更改為append
從源代碼:
def insertInto(self, tableName, overwrite=False):
self._jwrite.mode(
"overwrite" if overwrite else "append"
).insertInto(tableName)
這是如何使用它:
spark.conf.set("spark.sql.sources.partitionOverwriteMode","DYNAMIC")
data.write.insertInto("partitioned_table", overwrite=True)
或者在 SQL 版本中工作正常。
INSERT OVERWRITE TABLE [db_name.]table_name [PARTITION part_spec] select_statement
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.