Delta Table

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

支持

支持

数据导入

  • 支持流式写入,支持通过使用Flink写入数据到MaxCompute、DataWorks数据集成、DataHub等工具,完成高并发、可扩展的增量数据导入。

  • 支持增全量批式写入。

Stream/Batch Upload

Stream Upload方式写入即可见

Upsert

回溯查询(Time Travel)

支持按时间点或版本号直接查询历史快照,用于结果复现或审计分析。

详情请参见Time Travel

支持

支持

增量计算

增量物化视图(Delta Live MV),增量读取(Incremental Read)。

详情请参见增量计算增量查询

支持

(增量物化视图适配中)

支持

数据组织优化

自动维护增量数据文件,包括小文件合并、多级COMPACTION、数据排序等优化,保持稳定高效的数据存储和计算状态。

详情请参见:Append Delta Table数据组织优化PK Delta Table数据组织优化

支持

免配置bucket数,通过动态 Bucket 优化(Dynamic Bucketing)自适应数据分布。

支持

查询性能优化

分区和文件级统计信息(Min/Max等)、分区裁剪、列裁剪、谓词下推。

支持

支持

安全合规

存储加密/数据动态脱敏/行级访问控制等。

支持

支持

容灾与备份

表快照介绍(邀测)/回收站模式本地备份/同城容灾

支持

支持

成本

AliORC列存压缩/分层存储。

支持

支持

用户体验

面向实时化业务,实时数据更新

支持通过Stream Upload方式实现数据的实时写入与更新(Upsert),写入后立即可见。为了最大限度地平衡数据写入的实时性与查询性能,MaxCompute采用分层存储与优化策略:

  • 保障写入实时性:新写入的数据首先以未排序的方式快速落盘至增量未聚簇桶(Nonclustered Bucket),确保数据写入的低延迟和高吞吐。

  • 提高SQL查询性能:后台的增量重聚簇(Incremental Reclustering)服务会异步地将增量数据重排优化为有序的聚簇桶(Clustered Bucket)。查询时,查询引擎能高效裁剪已排序的主体数据,仅对少量增量数据进行扫描,从而兼顾了数据新鲜度与查询效率。

高效增量数据处理与分析

基于底层的增量数据读写能力,MaxCompute进一步提供了丰富的上层功能,以提升端到端数据分析的实效性。可以结合增量计算动态物化视图(Delta Live MV)(邀测)等高级特性,构建高效的实时数据处理链路,加速从数据产生到业务洞察的转化过程。

适应业务发展,突破原有表格式使用限制

  1. 动态分配Bucket:Append Delta Table表格式支持动态分配Bucket。用户无需在DDL时指定Bucket数,无需预估每个Partion未来的数据量再去换算出合适Bucket数。随着用户数据的持续写入,系统通过Bucket动态分配(Dynamic Bucketing)服务自动划分Bucket或创建新Bucket,动态适应业务数据量变化,解决单Bucket内数据量过大或者过小导致的数据倾斜和数据碎片等问题。

  2. 模式演进(Schema Evolution):满足业务发展对数据字段调整和数据精度提升的需求,支持添加、删除、修改、重命名列,且具备完全向后兼容性,不会误删或丢失数据。

  3. 突破原有表限制:NSERT INTOUPDATEDELETEMERGE INTO、Clustering排序存储可以在Delta Table一张表内实现,突破原有普通分区表、聚簇表的、Transaction Table上述能力不可兼得的使用限制。

  4. 适配多引擎计算:包括MaxCompute SQL、MaxFrame、Spark on MaxCompute等;开源引擎如Flink、Spark、StarRocks等也可通过Connector和开放存储API访问Delta Table。

兼顾性能与可靠性

  1. Delta Table适合TBEB级别的海量数据管理,即使在极大数据规模下,元数据操作依然快速响应,查询支持分区裁剪、列裁剪、谓词下推,可避免不必要的数据扫描。

  2. ACID事务管理:采用乐观并发控制,支持多写入方并发操作,冲突写会被检测并重试,确保数据一致性。

  3. 安全合规:满足数据安全与合规要求,支持存储加密、ACL表级列级访问控制、行级权限、动态脱敏等。

  4. 备份回滚:回收站模式的版本备份回滚机制,保障在出现数据污染和误删除时可快速将表回退到之前的健康状态,降低运维和管理风险。

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,取值范围为[24, 168]

表示TimeTravel可查询数据历史状态的时间范围(单位为小时)。

  • 取值为0时表示不保留数据历史状态,也就是不支持timetravel查询。

  • 如果数据历史状态存在时间超过了此参数设置的值,可被删除或者Compact。

  • 如果SQL timetravel查询的时间早于该参数的值,会直接报错,比如属性值为72小时,timetravel要查询72小时之前的数据历史状态,会直接报错。

acid.incremental.query.out.of.time.range.enabled

默认false

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表格式

  • PK Delta Table通过"transactional"="true"和指定PRIMARY KEY的方式声明。

  • 现在可通过"table.format.version"="2"和指定PRIMARY KEY的方式声明。

write.bucket.num

默认取值为16,取值范围为(0, 4096]

表示每个partition或者非分区表的分桶数量,也表示数据写入的并发节点数量。分区表支持修改,新分区默认生效;非分区表不支持修改。该参数用法可参考如下建议:

  • 如果是通过Tunnel导入,代表Tunnel并发节点数,设置结果会影响导入流量,也会受Tunnel最大并发节点数约束。

  • 如果是通过SQL写入,代表写入数据的Reducer的并发度,受Reducer最大并发节点数约束。

  • 建议每个Bucket的数据写入大小为500 MB左右。例如,分区大小估计为500 GB,粗略估算Bucket数目应该设为1000,这样平均每个Bucket大小约为500 MB。对于特别大的表,500 MB的限制可以突破,每个Bucket2 GB3 GB左右比较合适。

acid.data.retain.hours

默认取值为24,取值范围为[24, 168]

表示TimeTravel可查询数据历史状态的时间范围(单位为小时)。

  • 取值为0时表示不保留数据历史状态,也就是不支持timetravel查询。

  • 如果数据历史状态存在时间超过了此参数设置的值,可被删除或者Compact。

  • 如果SQL timetravel查询的时间早于该参数的值,会直接报错,比如属性值为72小时,timetravel要查询72小时之前的数据历史状态,会直接报错。

acid.incremental.query.out.of.time.range.enabled

默认false

True表示增量查询指定的endTimestamp,可以大于表最大的数据Commit Time。在endTimestamp大于当前时间的场景下,用户多次查询可能得到不同的结果,因为可能存在新的数据插入。

支持修改表的此参数取值。

acid.write.precombine.field

可以指定一个列的名称,且只能指定一个。

如果指定了列名,在同一提交的文件处理中,系统会结合主键(PK)列对数据去重,确保数据的唯一性和一致性。

说明

当一次性提交的数据量超过128MB时,会导致生成多个文件,该参数对多个文件不适用。

acid.partial.fields.update.enable

设置为true时,支持使用SQLTunnelDelta Table进行部分列更新

该参数在创建表时进行设置。表创建成功后不支持修改

注意事项

对比项

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 KeyHash Cluster。

CLUSTERED BY

生命周期LIFECYCLE

必须大于等于Time Travel可查询的生命周期,即lifecycle >= acid.data.retain.hours / 24。创建表时会做检查,不符合会报错。

/

/

  1. 存量普通表不支持直接修改为Delta Table。

  2. PK Delta Table不支持对主键列(PK)做表结构变更。

  3. PK Delta Table暂不支持JSON类型。

  4. 不支持CREATE TABLE AS。

DML

支持插入或覆写数据(INSERT INTO | INSERT OVERWRITE)更新或删除数据(UPDATE | DELETE)MERGE INTO等语法。

DQL

支持通用的查询分析方案。详情可参考DQL操作(SELECT)

数据导入

数据组织优化

  • 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分桶的方式,实现数据的高效写入与更新。