Delta表的模式更改-如何在不覆盖的情况下从表模式中删除分区?



给定一个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。表写入内存
  3. df.write。选项(" 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

相关内容

  • 没有找到相关文章

最新更新