Iceberg on Aura DDL语法说明
创建Iceberg表
通过CREATE TABLE语法创建Iceberg表。与其他格式的表相比,创建Iceberg表没有特别的参数需要指定,只需要指定STORE AS ICEBERG即可。具体语法请参见CREATE TABLE。
示例:
1 2 3 4 5 6 7 8 9 | CREATE TABLE iceberg_ext( col1 int, col2 varchar(20), ... )PARTITION BY (col3 bigint) TABLEPROPERTIES ( 'write.metadata.delete-after-commit.enabled'='true', 'write.metadata.previous-versions-max' = '10' ) STORE AS ICEBERG; |
其中write.metadata.delete-after-commit.enabled控制是否在提交事务后删除旧版本元数据文件,默认值为false。当该参数设为true时,可以通过write.metadata.previous-versions-max设定保留多少个metadata。
使用这两个参数需要谨慎,虽然删除元数据文件可以节省存储空间,但需要确保不会影响数据的一致性和可用性。
删除Iceberg表
通过DROP TABLE语法删除Iceberg表,会同时删除表的元数据及数据(Managed表删除后可以从LakeFormation控制台恢复表的元数据及数据)。具体语法,请参见DROP TABLE。
示例:
1 | DROP TABLE iceberg_ext; |
修改表中的列
通过ALTER TABLE语法的ADD COLUMN、RENAME COLUMN TO、ALTER COLUMN、DROP COLUMNS能力,可以对iceberg表的列进行加列、删列、重命名列、更新列和重新排序列等schema evolution操作。
iceberg通过唯一编号fieldId为列进行编号,在写入数据时会将fieldId写入文件的schema中,在读取文件的schema时通过fieldId将元数据的列与文件中的列映射起来,能够实现schema evolution后的读取。对于非iceberg写入的文件,schema中不存在fieldId,读取文件时会以列名为依据进行映射,进行schema evolution操作后,如果存在复用列名的情况,可能会导致类型不匹配而读取失败或者读取到了以前的数据。
示例:
建iceberg分区表:
CREATE TABLE t_iceberg(a int, b array<struct<x:int, y:int>>) partition by (c int) store as iceberg;
- 添加列:
iceberg表支持添加一列或者多列到表中或者复杂类型字段中,需要指定列名和类型,可以指定注释和位置。当添加到复杂类型字段中时,不能指定注释。
-- 添加到表中 alter table t_iceberg add column d int, e float comment 'this is e', f array<int> after a, g struct<x:int,y:int> comment 'this is g' before b; -- 添加到复杂类型字段中,需要使用element来指定array的子类型 alter table t_iceberg add column b.element.z int after x;
- 重命名列:
alter table t_iceberg rename column a to newa; alter table t_iceberg rename column b.element.x to newx;
- 更新列:
iceberg表支持更新表列的类型、注释和位置,支持更新复杂类型字段的类型和位置。
alter table t_iceberg alter column a type bigint comment 'this is a' after c, c type bigint comment 'this is c' after a, b.element.y type bigint after first;
当前仅支持从低精度类型更新到高精度类型:
- 整数类型:从smallint更新到int或者bigint,从int更新到bigint。
- 浮点类型:从float4更新到float8。
- numeric类型:从低precision更新到高precision,不支持更新scale。
- 字符串类型:varchar或者char的长度变长。
浮点类型的存储是不精确的,从float4更新到float8后,数据的小数部分精度会变化,结果会发生变化。
修改表属性
通过ALTER TABLE语法的SET/UNSET TABLEPROPERTIES能力,可以对表的属性值进行修改。
示例:
1 2 | ALTER TABLE iceberg_ext SET TABLEPROPERTIES ('write.metadata.delete-after-commit.enabled' = 'false'); ALTER TABLE iceberg_ext UNSET TABLEPROPERTIES ('write.metadata.delete-after-commit.enabled'); |