功能概述
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>'
)
;參數說明
使用樣本
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) |
建表語句 | | |
表生命週期 | 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 位元組的儲存大小。