功能概述
MaxCompute支持将Apache Iceberg表存储在阿里云对象存储(OSS)上,并通过MaxCompute统一管理元数据、权限和数据生命周期,实现高效查询、写入和管理。Iceberg表兼容Spark、Flink、Trino、Presto等开源引擎,支持多引擎共享同一份数据,适用于湖仓开放(Lakehouse)架构。
通过支持Iceberg开放表格式,MaxCompute打破数据孤岛,使数仓与Spark、Flink、Hive等开源引擎无缝共享同一份Iceberg表数据。用户可按需选择计算引擎,避免绑定单一技术栈,同时利用Iceberg的开放标准保障数据资产的长期可移植性,并支持包括跨云场景在内的组织协同。
MaxCompute管理的Iceberg表具备以下特性:
Iceberg湖表数据管理:
通过MaxCompute SQL创建和读写OSS上的Iceberg表,支持建表、删表、读写、时间旅行(Time Travel)、Schema Evolution和Partition Evolution。
自动化后台运维:
MaxCompute 提供内置的 Iceberg 表优化服务,包括小文件合并(Compaction)、过期快照清理(Expire Snapshots)、元数据文件归档等,无需手动调度或运维,显著降低使用复杂度。
元数据一致性保障:
表的元数据由 MaxCompute Metastore(MaxMeta) 统一维护,确保所有写入操作满足 ACID 事务语义。外部引擎若需写入 Iceberg 表,需通过 MaxCompute 提供的 Storage Write API 或使用 MaxCompute 内置计算引擎,避免多写入端导致的元数据冲突与数据不一致。
开放生态集成:
开源计算引擎(如 Trino、Presto、Spark、Flink、Doris 等)可以使用Iceberg兼容的方式访问MaxCompute管理的Iceberg表,实现低延迟、高并发的多引擎查询。
统一权限管理:通过MaxCompute统一管理的元数据服务和权限体系,数据湖的RAM权限体系和数仓权限体系可以统一定义,从而提供数仓的企业级权限管理能力。
注意事项
对MaxCompute管理的Iceberg表执行以下操作会导致数据丢失或不可读:
禁止操作 | 后果 | 正确做法 |
通过非MaxCompute的写接口(例如storage api 或sql等)在OSS上更新或修改管理目录下的Iceberg表数据 | 在外部修改或替换 Iceberg数据,会导致表无法通过一致性检查,并且变得不可读从而查询失败。 | 仅通过MaxCompute SQL修改数据 |
向OSS的Iceberg 表管理路径上传数据或添加新文件 | 上传的文件会被后台服务作为孤儿文件回收 | 不在管理路径下上传数据 |
基于同一OSS路径多次创建MaxCompute管理的Iceberg表 | 各表的垃圾回收进程会互相删除对方的文件 | 每个表使用不同的OSS路径 |
在具有父子目录关系的OSS路径上创建不同的MaxCompute管理的Iceberg表 | 每个表的后台垃圾回收进程都会将另一个表的文件视为脏数据或者孤儿文件,并将其删除,从而导致数据丢失。 | 避免在存在父子关系的路径上分别建表,每个MaxCompute管理的Iceberg 表使用不同的路径。 |
创建表
语法结构
CREATE ICEBERG TABLE [IF NOT EXISTS] <table name> (
<col_name> <data_type>,
...
)
PARTITIONED BY (<partitionExpression>)
WITH CONNECTION <connection name>
OPTIONS(
location='<oss_location>'
)
;参数说明
使用示例
CREATE ICEBERG TABLE mc_iceberg_table (
id bigint COMMENT '用户唯一标识ID',
name string COMMENT '用户姓名',
age bigint COMMENT '用户年龄',
gender string COMMENT '用户性别',
height float COMMENT '用户身高',
birthday date COMMENT '用户生日',
phone_number string COMMENT '用户电话号码',
email string COMMENT '用户电子邮箱',
address string COMMENT '用户地址',
salary decimal(18, 2) COMMENT '用户薪水',
create_time timestamp COMMENT '用户信息创建时间',
update_time timestamp COMMENT '用户信息更新时间',
is_deleted boolean COMMENT '用户信息是否被删除的标志位',
dt string COMMENT '分区字段'
)
PARTITIONED BY (dt)
WITH CONNECTION <connection name>
OPTIONS(
location='oss://oss-cn-<region>-internal.aliyuncs.com/<oss bucket>/Demo-iceberg/'
);写入数据
MaxCompute写入语法详情,请参见语法说明。
示例如下:
SET odps.sql.type.system.odps2=true; SET odps.sql.decimal.odps2=true; INSERT INTO mc_iceberg_table VALUES (1, '张三', 18, '男', cast (178.56 as float), DATE '1990-01-01', '13800000000', 'zhangsan@example.com', '北京市海淀区', 5000.00, TIMESTAMP '2023-04-19 11:32:00', TIMESTAMP '2023-04-19 11:32:00', false,'20260402'), (2, '李四', 20, '女', cast (162.70 as float), DATE '1992-02-02', '13900000000', 'lisi@example.com', '上海市浦东新区', 6000.00, TIMESTAMP '2023-04-19 11:32:00', TIMESTAMP '2023-04-19 11:32:00',false,'20260401'), (3, '王五', 22, '男', cast (185.21 as float), DATE '1994-03-03', '14000000000', 'wangwu@example.com', '深圳市南山区', 7000.00, TIMESTAMP '2023-04-19 11:32:00', TIMESTAMP '2023-04-19 11:32:00', false,'20260403') ;
查询分析
SELECT语法详情,请参见语法说明。
示例如下:
SELECT * FROM mc_iceberg_table; -- 返回结果如下: +------------+------+------------+--------+--------+----------+--------------+-------+---------+--------+-------------+-------------+------------+----+ | id | name | age | gender | height | birthday | phone_number | email | address | salary | create_time | update_time | is_deleted | dt | +------------+------+------------+--------+--------+----------+--------------+-------+---------+--------+-------------+-------------+------------+----+ | 1 | 张三 | 18 | 男 | 178.56 | 1990-01-01 | 13800000000 | zhangsan@example.com | 北京市海淀区 | 5000 | 2023-04-19 03:32:00 | 2023-04-19 03:32:00 | false | 20260402 | | 2 | 李四 | 20 | 女 | 162.7 | 1992-02-02 | 13900000000 | lisi@example.com | 上海市浦东新区 | 6000 | 2023-04-19 03:32:00 | 2023-04-19 03:32:00 | false | 20260401 | | 3 | 王五 | 22 | 男 | 185.21 | 1994-03-03 | 14000000000 | wangwu@example.com | 深圳市南山区 | 7000 | 2023-04-19 03:32:00 | 2023-04-19 03:32:00 | false | 20260403 | +------------+------+------------+--------+--------+----------+--------------+-------+---------+--------+-------------+-------------+------------+----+
Iceberg外部表与MaxCompute管理的Iceberg表对比
维度 | Iceberg外部表(External) | MaxCompute管理的Iceberg表(Managed) |
建表语句 | | |
表生命周期 | MaxCompute仅建立映射关系。DROP TABLE只删除元数据,不删除OSS数据。 | MaxCompute负责元数据和OSS数据全生命周期管理。建表时指定的OSS目录必须为空。DROP TABLE只删除元数据,不删除OSS数据。 |
元数据及数据治理 | 与普通外部表一致 | 提供高性能metadata caching能力 |
数据开放性(开源引擎读写) | 读写一致性依赖Iceberg表格式自身保障 | 由MaxCompute保障数据读写一致性。开源引擎可直读OSS,或通过MaxCompute Storage API读写。 |
湖表维护 | 用户自行维护 | 后台自动维护:
|
支持数据类型
Iceberg数据类型 | MaxCompute数据类型 | 读写支持 |
Types.BooleanType | BOOLEAN | |
Types.IntegerType | INT | |
Types.LongType | BIGINT | |
Types.FloatType | FLOAT | |
Types.DoubleType | DOUBLE | |
Types.DecimalType | DECIMAL(precision, scale)
| |
Types.DateType | DATE | |
Types.TimeType | BIGINT
| |
Types.TimestampType | TIMESTAMP_NTZ | |
Types.TimestampType_z | TIMESTAMP | |
Types.StringType | STRING | |
Types.UUIDType | BINARY | |
Types.FixedType | BINARY | |
Types.BinaryType | BINARY | |
TypeID.STRUCT | STRUCT | |
TypeID.LIST | ARRAY | |
TypeID.MAP | MAP | |
不涉及 | TINYINT\SMALLINT\VARCHAR(n)\CHAR(n)\DATETIME\JSON | 不涉及 |
使用限制
版本限制
目前仅支持 Iceberg sdk 1.6.1 兼容feature。
目前仅支持 Iceberg table format v2 数据读写。
支持操作
暂不支持操作
MaxCompute管理的Iceberg表
不支持改表名语句。
不支持XCOPY跨地域复制 语句。
不支持CLONE TABLE修改表名语句。
不支持表快照(Snapshot)修改表名语句。
不支持设置字段默认值。
不支持修改列的数据类型。
不支持物化视图操作。
不支持UPDATE。
不支持行级访问控制。
不支持TRUNCATE。
不支持CDC(邀测)。
不支持跨地域灾备。
不支持本地备份。
不支持 CREATE OR REPLACE 语句。
不支持 LOAD 和 UNLOAD 命令。
通过控制台或 API 查询时,MaxCompute管理的Iceberg表会显示 0 字节的存储大小。