Delta Table是由MaxCompute自主研发的,为大规模分析型数据集打造的高性能表格式(Table Format)。Delta Table包含无主键表Append Delta Table和主键表PK Delta Table,支持ACID事务、增量查询、回溯查询(Time Travel)、动态Cluster分桶、数据实时更新、模式演进(Schema Evolution)等功能。 利用MaxCompute平台内原生提供的湖仓一体和近实时计算能力,用户通过标准SQL即可创建、更新和查询Delta Table,而无需关心复杂的底层存储与元数据管理,后者均由 MaxCompute自动维护和优化,兼顾易用性与高性价比。
支持地域
地域名称 | 地域ID |
华北2(北京) | cn-beijing |
华北3(张家口) | cn-zhangjiakou |
华北6(乌兰察布) | cn-wulanchabu |
华东1(杭州) | cn-hangzhou |
华东2(上海) | cn-shanghai |
华南1(深圳) | cn-shenzhen |
西南1(成都) | cn-chengdu |
功能规格
类别 | 功能项 | Append Delta Table | PK Delta Table |
基础DML | Insert / Update / Delete / Merge Into。 | 支持 | 支持 |
ACID 事务 | Read Committed/Snapshot Isolation。 详情请参见ACID事务管理。 | 支持 | 支持 |
主键 | 定义主键(Primary Key)。 | 不支持 | 支持部分列更新 |
模式演进(Schema Evolution) | 列增加、删除、重命名、顺序修改、列类型修改。 详情请参见ALTER TABLE。 | 支持 | 支持 |
数据导入 |
| Stream/Batch Upload Stream Upload方式写入即可见 | Upsert |
回溯查询(Time Travel) | 支持按时间点或版本号直接查询历史快照,用于结果复现或审计分析。 详情请参见Time Travel。 | 支持 | 支持 |
增量计算 | 增量物化视图(Delta Live MV),增量读取(Incremental Read)。 | 支持 (增量物化视图适配中) | 支持 |
数据组织优化 | 自动维护增量数据文件,包括小文件合并、多级COMPACTION、数据排序等优化,保持稳定高效的数据存储和计算状态。 | 支持 免配置bucket数,通过动态 Bucket 优化(Dynamic Bucketing)自适应数据分布。 | 支持 |
查询性能优化 | 分区和文件级统计信息(Min/Max等)、分区裁剪、列裁剪、谓词下推。 | 支持 | 支持 |
安全合规 | 支持 | 支持 | |
容灾与备份 | 支持 | 支持 | |
成本 | AliORC列存压缩/分层存储。 | 支持 | 支持 |
用户体验
面向实时化业务,实时数据更新
支持通过Stream Upload
方式实现数据的实时写入与更新(Upsert),写入后立即可见。为了最大限度地平衡数据写入的实时性与查询性能,MaxCompute采用分层存储与优化策略:
保障写入实时性:新写入的数据首先以未排序的方式快速落盘至增量未聚簇桶(Nonclustered Bucket),确保数据写入的低延迟和高吞吐。
提高SQL查询性能:后台的增量重聚簇(Incremental Reclustering)服务会异步地将增量数据重排优化为有序的聚簇桶(Clustered Bucket)。查询时,查询引擎能高效裁剪已排序的主体数据,仅对少量增量数据进行扫描,从而兼顾了数据新鲜度与查询效率。
高效增量数据处理与分析
基于底层的增量数据读写能力,MaxCompute进一步提供了丰富的上层功能,以提升端到端数据分析的实效性。可以结合增量计算、动态物化视图(Delta Live MV)(邀测)等高级特性,构建高效的实时数据处理链路,加速从数据产生到业务洞察的转化过程。
适应业务发展,突破原有表格式使用限制
动态分配Bucket:Append Delta Table表格式支持动态分配Bucket。用户无需在DDL时指定Bucket数,无需预估每个Partion未来的数据量再去换算出合适Bucket数。随着用户数据的持续写入,系统通过Bucket动态分配(Dynamic Bucketing)服务自动划分Bucket或创建新Bucket,动态适应业务数据量变化,解决单Bucket内数据量过大或者过小导致的数据倾斜和数据碎片等问题。
模式演进(Schema Evolution):满足业务发展对数据字段调整和数据精度提升的需求,支持添加、删除、修改、重命名列,且具备完全向后兼容性,不会误删或丢失数据。
突破原有表限制:NSERT INTO、UPDATE、DELETE、MERGE INTO、Clustering排序存储可以在Delta Table一张表内实现,突破原有普通分区表、聚簇表的、Transaction Table上述能力不可兼得的使用限制。
适配多引擎计算:包括MaxCompute SQL、MaxFrame、Spark on MaxCompute等;开源引擎如Flink、Spark、StarRocks等也可通过Connector和开放存储API访问Delta Table。
兼顾性能与可靠性
Delta Table适合TB到EB级别的海量数据管理,即使在极大数据规模下,元数据操作依然快速响应,查询支持分区裁剪、列裁剪、谓词下推,可避免不必要的数据扫描。
ACID事务管理:采用乐观并发控制,支持多写入方并发操作,冲突写会被检测并重试,确保数据一致性。
安全合规:满足数据安全与合规要求,支持存储加密、ACL表级列级访问控制、行级权限、动态脱敏等。
备份回滚:回收站模式的版本备份回滚机制,保障在出现数据污染和误删除时可快速将表回退到之前的健康状态,降低运维和管理风险。
SQL相关操作
DDL
创建Append Delta Table
-- 创建Append Delta Table
CREATE TABLE <table_name> (
<col_name <data_type> [NOT NULL] [DEFAULT <default_value>] [comment <col_comment>], ...
)
[comment <table_comment>]
[RANGE CLUSTERD BY (<col_name> [, <col_name>, ...]) ]
TBLPROPERTIES (
"table.format.version"="2"
["acid.data.retain.hours"="hours"...]
)
[LIFECYCLE <days>];
TBLPROPERTIES参数说明如下:
参数 | 是否必填 | 说明 | 备注 |
"table.format.version"="2" | 是 | 声明Delta Table表格式 | |
acid.data.retain.hours | 否 | 默认取值为24,取值范围为 | 表示TimeTravel可查询数据历史状态的时间范围(单位为小时)。
|
acid.incremental.query.out.of.time.range.enabled | 否 | 默认 | True表示增量查询指定的endTimestamp,可以大于表最大的数据Commit Time。在endTimestamp大于当前时间的场景下,用户多次查询可能得到不同的结果,因为可能存在新的数据插入。 支持修改表的此参数取值。 |
创建PK Delta Table
-- 创建PK Delta Table
CREATE TABLE <table_name> (
<col_name <data_type> [NOT NULL] [DEFAULT <default_value>] [comment <col_comment>], ...
PRIMARY KEY (<pk_col_name>[, <pk_col_name2>, ...] )
)
[comment <table_comment>]
TBLPROPERTIES (
"table.format.version"="2"
[, "write.bucket.num" = "N", "acid.data.retain.hours"="hours"...]
)
[LIFECYCLE <days>];
参数说明如下:
PRIMARY KEY(PK):必填。创建Delta Table主键表时必填,可包含多列。可以定义一个或多个列作为主键,表示这些列的组合在表中必须唯一,语法遵循标准SQL primary key语法,pk列必须设置NOT NULL,不允许修改。
设置后,表数据会根据PK列去重,Unique约束在单个partition范围内有效,或非分区表内有效。
TBLPROPERTIES参数说明如下:
参数 | 是否必填 | 说明 | 备注 |
"table.format.version"="2" | 是 | 声明Delta Table表格式 |
|
write.bucket.num | 否 | 默认取值为16,取值范围为 | 表示每个partition或者非分区表的分桶数量,也表示数据写入的并发节点数量。分区表支持修改,新分区默认生效;非分区表不支持修改。该参数用法可参考如下建议:
|
acid.data.retain.hours | 否 | 默认取值为24,取值范围为 | 表示TimeTravel可查询数据历史状态的时间范围(单位为小时)。
|
acid.incremental.query.out.of.time.range.enabled | 否 | 默认 | True表示增量查询指定的endTimestamp,可以大于表最大的数据Commit Time。在endTimestamp大于当前时间的场景下,用户多次查询可能得到不同的结果,因为可能存在新的数据插入。 支持修改表的此参数取值。 |
acid.write.precombine.field | 否 | 可以指定一个列的名称,且只能指定一个。 | 如果指定了列名,在同一提交的文件处理中,系统会结合主键(PK)列对数据去重,确保数据的唯一性和一致性。 说明 当一次性提交的数据量超过128MB时,会导致生成多个文件,该参数对多个文件不适用。 |
acid.partial.fields.update.enable | 否 | 设置为 | 该参数在创建表时进行设置。表创建成功后不支持修改。 |
注意事项
对比项 | Append Delta Table | PK Delta Table | 聚簇表 |
Bucket数量 | 无需指定write.bucket.num,Bucket数量根据实际数据量动态变化。 | 需在DDL时指定Bucket数,默认取值为16。 | / |
数据组织策略 | RANGE CLUSTERED BY,不支持CLUSTERED BY,无需指定SORT BY 字段,Bucket内数据排序默认使用RANGE CLUSTERD BY指定的字段。 | 不支持设置CLUSTER BY,默认使用Primary Key做Hash Cluster。 | CLUSTERED BY |
生命周期LIFECYCLE | 必须大于等于Time Travel可查询的生命周期,即 | / | / |
存量普通表不支持直接修改为Delta Table。
PK Delta Table不支持对主键列(PK)做表结构变更。
PK Delta Table暂不支持JSON类型。
不支持CREATE TABLE AS。
DML
支持插入或覆写数据(INSERT INTO | INSERT OVERWRITE)、更新或删除数据(UPDATE | DELETE)、MERGE INTO等语法。
DQL
支持通用的查询分析方案。详情可参考DQL操作(SELECT)。
数据导入
Append Delta Table支持通过批量数据传输(Upload)与 流式数据传输(Stream Upload)两种方式导入数据,由于没有PK,数据传输链路不支持Upsert/Delete接口。
PK Delta Table支持通过Tunnel Upsert/Delete接口写入数据,对于不存在的PK,Upsert操作插入新的数据;对于已经存在的PK,Upsert操作将对应非PK字段更新。
数据组织优化
Append Delta Table数据组织结构,请参考Append Delta Table数据组织优化,底层采用Range Clustering结构,默认使用Row_ID作为clustering key,bucket数量随着用户数据增长动态分配,用户指定Cluster Key之后,通过后台clustering作业对数据执行增量reclustering,保证数据的整体有序性。
PK Delta Table数据组织结构,请参考PK Delta Table数据组织优化,底层采用Hash Clustering结构,通过将PK字段Hash分桶的方式,实现数据的高效写入与更新。