全部產品
Search
文件中心

MaxCompute:MaxCompute管理的Iceberg表(beta)

更新時間:Jun 11, 2026

重要

該功能目前處於邀測中,如需試用,請填寫試用申請表單。提交後,MaxCompute產品團隊將在3個工作日內完成審核,審核結果以簡訊通知。如對審核結果有疑問,請通過申請連結聯絡。

功能概述

MaxCompute支援將Apache Iceberg表格儲存體在阿里雲Object Storage Service上,並通過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>'
)
;

參數說明

點擊展開查看參數詳情

參數名稱

是否必填

說明

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路徑,即data和metadata目錄的上一級。

格式為location='oss://<Bucket名稱>/<OSS目錄名稱>/'

  • Bucket名稱:OSS儲存空間名稱。儲存空間名稱更多資訊,請參見列舉儲存空間

  • 目錄名稱:OSS目錄名稱。目錄後不需要指定檔案名稱。例如oss://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 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)級精度把資料寫入Iceberg的Time類型。

  • 寫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

不涉及

使用限制