如果需要重命名列、删除列或添加新列怎么办?这对于Hive表来说是一项痛苦的任务,因为需要覆盖现有数据。
使用Iceberg,Schema Evolution能正常工作。添加新列不会影响现有数据。可以添加、删除、重命名和重新排序列。最重要的是,Schema更改永远不需要重写表。详情请参阅文档 。
通过检查当前元数据文件,我们可以看到我们只有一个模式(schemas字段),即在表创建期间定义的模式。
show_current_metadata_file(ICEBERG_CUSTOMER_TABLE)
使用以下DDL命令将c_email_address列名更改为email。
%%sql
ALTER TABLE ${ICEBERG_DB}.${ICEBERG_CUSTOMER_TABLE} RENAME COLUMN c_email_address TO email
%%sql
SELECT * FROM ${ICEBERG_DB}.${ICEBERG_CUSTOMER_TABLE} limit 10
注意,由于Schema Evolution,没有创建新的数据文件。Schema更改存储在元数据层。
show_data_files(ICEBERG_CUSTOMER_TABLE)
从下面的最新元数据文件中可以看到,现在有2个schema:schema-id=0(原始模式)和schema-id=1(新模式)。Iceberg利用schema映射使schema evolution轻量级且灵活:
show_current_metadata_file(ICEBERG_CUSTOMER_TABLE)
可以使用以下DDL命令添加新列。
%%sql
ALTER TABLE ${ICEBERG_DB}.${ICEBERG_CUSTOMER_TABLE} ADD COLUMN c_birth_date int
注意,默认情况下,新列对所有现有行的值为null。
spark.sql(f"""
SELECT * FROM {ICEBERG_DB}.{ICEBERG_CUSTOMER_TABLE} limit 10
"""
).show(truncate=False)
重新检查metadata,现在使用的是schema id = 2 :