给定一个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/'
如何实现模式更改?
我最终采用了以下方法:
- 备份原表到安全侧
- spark.read。表写入内存
- 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