MaxCompute在Append Delta Table表格式中进一步支持Hash Cluster,在支持增量数据处理的同时提升查询性能。本文介绍其与其他表类型的差异、建表语法、SQL及数据通道 SDK 使用示例。
适用场景
推荐在以下场景使用 Hash Cluster:
等值过滤查询:按固定列做点查或等值过滤,减少扫描量。
等值JOIN / GROUP BY:多表按相同KEY关联或聚合,减少 Shuffle。
与相似表类型对比
表类型 | 聚簇方式 | 增量写入(ACID) | |
Hash | 不支持 | 有 Hash Clustering(Shuffle + Sort)优化,但不支持 ACID。 | |
Hash | 支持 | 有 ACID 能力与 Hash Clustering 优化,适用于有主键数据。读写性能弱于无主键的表。 | |
Range | 支持 | 有 ACID 能力与重聚簇支持,但聚簇方式为 Range,写入性能弱于 Hash。 | |
Append Delta Table - Hash Cluster | Hash | 支持 | 集 Hash Clustering 优化(Shuffle + Sort)与完整 ACID 能力于一体,同时支持后台增量与全量重聚簇。是上述三类表中综合能力最完整的类型。 |
前提条件
开启以下 Session 参数后再建表:
SET odps.table.append2.enable=true;
SET odps.table.hash.delta.enable=true; -- hash delta 建表试用开关建表语法
CREATE TABLE [IF NOT EXISTS] <table_name>
[(<col_name> <data_type> [comment <col_comment>], ...)]
[PARTITIONED BY (<col_name> <data_type> [comment <col_comment>], ...)]
CLUSTERED BY (<col_name> [, <col_name>, ...])
[SORTED BY (<col_name> [, <col_name>, ...])] -- 仅支持升序
INTO <number_of_buckets> BUCKETS
TBLPROPERTIES ('table.format.version' = '2'); 参数说明:
参数 | 说明 |
| 指定 Hash 分桶列。建议选择在等值过滤、JOIN、GROUP BY 或 WINDOW PARTITION BY 中频繁使用的列,且该列的取值种类尽量多,以充分发挥分桶效果。 |
| 可选。指定桶内排序列。当前仅支持升序排序。建议选择范围/等值过滤列、窗口计算或版本时间列。 |
| 指定逻辑 Bucket 数。建议结合数据量、查询并发和分桶列基数设置。 Bucket 数量和写表时并发度,读表 Shuffle 优化时并发度相关。 |
| 设置为 |
SQL 使用示例
本示例以商品状态和价格版本表为例。业务上通常会按 item_id 点查或关联商品,因此将 item_id 作为 Hash 分桶列;版本生效时间 event_time 用于查看历史变化,因此将 event_time 作为桶内排序列。该设计适用于缓慢变化维表、商品价格版本表、状态变更明细表等场景。
准备工作
SET odps.sql.type.system.odps2=true;
SET odps.table.append2.enable=true;
SET odps.table.hash.delta.enable=true;建表
非分区表
CREATE TABLE hash_delta_sales_demo (
item_id BIGINT,
event_time TIMESTAMP,
price DOUBLE,
status STRING
)
CLUSTERED BY (item_id)
SORTED BY (event_time)
INTO 256 BUCKETS
TBLPROPERTIES ('table.format.version' = '2');分区表
如果数据需要按日期管理,也可以创建分区表:
CREATE TABLE hash_delta_sales_demo_pt (
item_id BIGINT,
event_time TIMESTAMP,
price DOUBLE,
status STRING
)
PARTITIONED BY (ds STRING)
CLUSTERED BY (item_id)
SORTED BY (event_time)
INTO 256 BUCKETS
TBLPROPERTIES ('table.format.version' = '2');通过DESC EXTENDED hash_delta_sales_demo;查看表信息。表的分桶和排序定义如下:
ClusterType: hash
BucketNum: 256
ClusterColumns: [item_id]
SortColumns: [event_time ASC]增量写入
以下以非分区表为例,演示增量写入和重聚簇过程。
初始写入数据:
INSERT INTO TABLE hash_delta_sales_demo VALUES (1001, TIMESTAMP '2026-05-01 10:00:00', 10.00, 'active'), (1001, TIMESTAMP '2026-05-03 10:00:00', 13.00, 'active'), (1002, TIMESTAMP '2026-05-01 11:00:00', 20.00, 'active'); DESC EXTENDED hash_delta_sales_demo;删除操作
删除一部分数据后查看表状态:
DELETE FROM hash_delta_sales_demo WHERE item_id = 1002; DESC EXTENDED hash_delta_sales_demo;补写历史数据
补写一条历史版本。该版本的 event_time 位于 item_id=1001 已有时间范围中间:
INSERT INTO TABLE hash_delta_sales_demo VALUES (1001, TIMESTAMP '2026-05-02 09:00:00', 12.00, 'active'); DESC EXTENDED hash_delta_sales_demo;
Bucket Pruning
对分桶列做等值查询时,MaxCompute 会根据 Hash 分布直接定位目标 Bucket,跳过其余 Bucket 的扫描。以下查询按 item_id = 1001 过滤,实际只读取该值所在的 1 个逻辑Bucket,而非全表扫描:
SELECT * FROM hash_delta_sales_demo
WHERE item_id = 1001
ORDER BY event_time
LIMIT 10;
-- 返回结果:
+------------+---------------------+------------+--------+
| item_id | event_time | price | status |
+------------+---------------------+------------+--------+
| 1001 | 2026-05-01 10:00:00 | 10.0 | active |
| 1001 | 2026-05-02 09:00:00 | 12.0 | active |
| 1001 | 2026-05-03 10:00:00 | 13.0 | active |
+------------+---------------------+------------+--------+全量重聚簇
如果需要重新整理存量数据,执行 RECLUSTER FULL。该操作会保留表中的历史数据语义,并按照当前表定义重新组织存储数据。
ALTER TABLE hash_delta_sales_demo RECLUSTER FULL;
DESC EXTENDED hash_delta_sales_demo;Hash Delta 表支持 INSERT、UPDATE、DELETE、MERGE INTO 等增量写入,同时保留 Hash 分布信息。优化器基于当前数据状态选择执行计划:数据有序时利用有序存储,数据变为非全量有序后仍可利用 Hash 分桶,必要时通过RECLUSTER FULL 恢复全量排序。
数据通道使用示例
以上文中 hash_delta_sales_demo 表为例,介绍通过数据传输服务 SDK 进行 Hash Clustered Delta Table 的数据上传/下载。
导入SDK依赖包
建议使用最新版本,至少需要升级到0.59版本及以上。详情参见版本更新记录。
示例代码
常见问题
如何选择合适的单 Bucket 存储量?
建议将单 Bucket 存储量控制在数百 MB 到数十 GB 之间。
Bucket 过小:存储开销上升,Shuffle 代价增大。
Bucket 过大:写表时间较长,查询时 Bucket Pruning 的过滤效果下降, Shuffle 优化效果下降。
建议根据预期数据增长量(而非当前量)来设置 Bucket 数,避免频繁修改表结构。
如果业务数据量确实偏大,单 Bucket 也可支持更大存储,也可以将 Bucket Num 设置的更大,但需结合实际写入与查询性能综合评估。