[英]How to overwrite a specific table partition in spark scala
我有一個按日期分區的表,我試圖覆蓋一個特定的分區,但是當我嘗試下面的代碼時,它會覆蓋整個表
query.write.partitionBy("date").mode(SaveMode.Overwrite).format("orc").insertInto(mytableName)
但我想通過提供分區列名稱及其值來覆蓋特定分區,例如partitionBy(date='20-01-2021')
;
有沒有辦法覆蓋特定分區?
您可以指定要覆蓋的分區的完整路徑。 在這種情況下,您不需要執行query.write.partitionBy("date")
並且您需要在編寫之前刪除date
列:
query.drop("date")
.write
.mode("overwrite")
.format("orc")
.save("/data/mytableName/date=20-01-2021")
嘗試這種方法並適應您的具體情況:
需要在 hive 或 spark 中設置表。
遵循這種動態的方法:
spark.conf.set("spark.sql.sources.partitionOverwriteMode", "dynamic")
import org.apache.spark.sql.types._
val df = spark.range(9).map(x => (x, (x + 100) % 3)).toDF("c1", "c2")
df.repartition($"c2")
.write
.partitionBy("c2")
.mode("overwrite").saveAsTable("tabX")
更新分區 - 人為,在設置后以這種方式
val df2 = spark.range(1).map(x => (x, (x + 100) % 3)).toDF("c1", "c2")
df2.repartition($"c2")
.write
.mode("overwrite").insertInto("tabX")
查看效果並根據您的具體情況進行調整。
// from 9 -> 7 entries, pls run
val df3 = spark.table("tabX")
df3.show(false)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.