簡體   English   中英

如何覆蓋火花scala中的特定表分區

[英]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.

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