MaxCompute管理的Iceberg表(beta)

更新时间:
复制为 MD 格式

重要

该功能目前处于邀测中,如需试用,请填写试用申请表单。提交后,MaxCompute产品团队将在3个工作日内完成审核,审核结果以短信通知。如对审核结果有疑问,请通过申请链接联系。

功能概述

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 EvolutionPartition 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修改数据

OSSIceberg 表管理路径上传数据或添加新文件

上传的文件会被后台服务作为孤儿文件回收

不在管理路径下上传数据

基于同一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>'
)
;

参数说明

点击展开查看参数详情

参数名称

是否必填

说明

table name

待创建的表名。

表名大小写不敏感,在查询Managed Iceberg Table 时,无需区分大小写,且不支持强制转换大小写。

col_name

表的列名。

在读取OSS数据场景,创建的Managed Iceberg Table 结构必须与OSS数据文件结构保持一致,否则无法成功读取OSS数据。

data_type

列数据类型。

在读取OSS的数据场景,Managed Iceberg Table 各列数据类型必须与OSS数据文件各列数据类型保持一致,否则无法成功读取OSS数据。

table_comment

表注释。注释内容为长度不超过1024字节的有效字符串,否则报错。

partitionExpression

分区表达式,语义同 iceberg partition表达式。支持如下几种场景:

  • <col_name>:分区值等于列的原始值。

  • BUCKET ( <num_buckets> , <col_name> ):对列值进行哈希运算,然后对 N 取模。结果范围是 0 到 N-1。

  • TRUNCATE ( <width> , <col_name> ):根据width对字段进行截断,截断后的值作为分区值。

  • YEAR ( <col_name> ):提取日期或时间戳年份。

  • MONTH ( <col_name> ):提取日期或时间月份。

  • DAY ( <col_name> ):提取日期或时间戳的天。

  • HOUR ( <col_name> ):提取日期或时间戳的小时。

connection name

指定CONNECTION的名称。详情见创建CONNECTION

oss_location

数据文件所在OSS路径,即datametadata目录的上一级。

格式为location='oss://<oss_endpoint>/<Bucket名称>/<OSS目录名称>/'

  • oss_endpoint:OSS访问域名信息。需要使用OSS提供的经典网络域名,即带 -internalendpoint。OSS网络域名信息,请参见地域和Endpoint。若不写endpoint。系统会默认补充一个当前Project所在地域的endpoint,但是如果文件存储跨地域,可能存在数据连通性问题。

    • 例如oss://oss-cn-beijing-internal.aliyuncs.com/xxx

    • 建议数据文件存放的OSS地域与MaxCompute项目所在地域保持一致。如果跨地域,数据连通性可能存在问题。

  • Bucket名称:OSS存储空间名称。Bucket名称需要在oss_endpoint后面。例如oss://oss-cn-beijing-internal.aliyuncs.com/your_bucket/path/。存储空间名称更多信息,请参见列举存储空间

  • 目录名称:OSS目录名称。目录后不需要指定文件名。例如oss://oss-cn-beijing-internal.aliyuncs.com/oss-mc-test/Demo1/

使用示例

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)

建表语句

CREATE EXTERNAL TABLE [if NOT EXISTS] <mc_oss_extable_name>
(
 <col_name> <data_type>,
 ...
)
[COMMENT <table_comment>]
[PARTITIONED BY (<col_name> <data_type>, ...)]
STORED AS ICEBERG
WITH SERDEPROPERTIES (
 'odps.properties.rolearn'='acs:ram::<uid>:role/aliyunodpsdefaultrole'
)
LOCATION '<oss_location>' 
TBLPROPERTIES ('<tbproperty_name>'='<tbproperty_value>',...);
CREATE [OR REPLACE] ICEBERG TABLE [IF NOT EXISTS] <table name> 
(
 <col_name> <data_type>,
 ...
)
PARTITIONED BY (<partitionExpression>)
WITH CONNECTION <connection name>
OPTIONS(
 <identifier> = expr,
 ...
)
[LIFECYCLE <days>];

表生命周期

MaxCompute仅建立映射关系。DROP TABLE只删除元数据,不删除OSS数据。

MaxCompute负责元数据和OSS数据全生命周期管理。建表时指定的OSS目录必须为空。DROP TABLE只删除元数据,不删除OSS数据。

元数据及数据治理

与普通外部表一致

提供高性能metadata caching能力

数据开放性(开源引擎读写)

读写一致性依赖Iceberg表格式自身保障

MaxCompute保障数据读写一致性。开源引擎可直读OSS,或通过MaxCompute Storage API读写。

湖表维护

用户自行维护

后台自动维护:

  • 自动Compaction

  • 过期快照自动清理

  • 自动垃圾回收

支持数据类型

Iceberg数据类型

MaxCompute数据类型

读写支持

Types.BooleanType

BOOLEAN

支持

Types.IntegerType

INT

支持

Types.LongType

BIGINT

支持

Types.FloatType

FLOAT

支持

Types.DoubleType

DOUBLE

支持

Types.DecimalType

DECIMAL(precision, scale)

  • 0 <= precision <= 38

  • 0 <= scale <= 18

支持

Types.DateType

DATE

支持

Types.TimeType

BIGINT

  • MaxCompute以微秒(micro second)级精度把数据写入IcebergTime类型。

  • Iceberg外部表需要在TBLPROPERTIES参数列表中指定 time 字段 iceberg_time_fields

    • col1;col2

    • list 类型: col1.entry

    • map 类型: col1.key;col1.value

    • struct 类型:col1.field1;col2.field2

支持

Types.TimestampType

TIMESTAMP_NTZ

支持

Types.TimestampType_z

TIMESTAMP

支持

Types.StringType

STRING

支持

Types.UUIDType

BINARY

  • uuid长度不超过16。

  • uuid转换详情参考转换链接

  • Iceberg外部表需要在TBLPROPERTIES参数列表中指定 uuid 字段 :iceberg_uuid_fields。

    • col1;col2

    • list 类型: col1.entry

    • map 类型: col1.key;col1.val

    • struct 类型:col1.field1;col2.field2

不支持

Types.FixedType

BINARY

支持

Types.BinaryType

BINARY

支持

TypeID.STRUCT

STRUCT

支持

TypeID.LIST

ARRAY

支持

TypeID.MAP

MAP

支持

不涉及

TINYINT\SMALLINT\VARCHAR(n)\CHAR(n)\DATETIME\JSON

不涉及

使用限制