簡體   English   中英

Delta 表中的架構更改 - 如何在不覆蓋的情況下從表架構中刪除分區?

[英]Schema change in Delta table - How to remove a partition from the table schema without overwriting?

給定一個 Delta 表:

CREATE TABLE IF NOT EXISTS mytable (
 ...
)
USING DELTA
PARTITIONED BY part_a, part_b, part_c
LOCATION '/some/path/'

該表已經有大量數據。 但是,所需的架構是:

CREATE TABLE IF NOT EXISTS mytable (
 ...
)
USING DELTA
PARTITIONED BY part_a, part_b -- <<-- ONLY part_a and part_b for partitions, ie, removing part_c
LOCATION '/some/path/'

如何實現這種模式變化?

我最終采取了以下方法:

  1. 備份原表以防萬一
  2. spark.read.table 到 memory
  3. df.write.option(“overwriteSchema”, “true”) 到原來的位置

我選擇了這種方法,所以我不需要更改原始數據位置。

詳細信息: 1. 備份原始表以確保安全因為這是在 Databricks 上,所以我可以使用他們專有的deep clone功能:

create table mydb.mytable_backup_before_schema_migration_v1 
deep clone mydb.mytable
location 'dbfs:/mnt/defaultDatalake/backups/zones/mydb/mytable_backup_before_schema_migration_v1'

如果您不在 Databricks 中並且無權訪問其deep clone ,您仍然可以通過將副本讀寫到另一個地方來備份表。

2. 讀取和 3. 用新模式覆蓋

val df = spark.read.format("delta").table("mydb.mytable")

df
.write
.format("delta")
.mode("overwrite")
.partitionBy("part_a", "part_b")
.option("overwriteSchema", "true")
.saveAsTable("mydb.mytable") // same table, same location, but different data physical organization because partition changes

暫無
暫無

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

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