分桶键(Clustered Key)与排序键(Sorted Key)
在建表时通过
CLUSTERED BY
CLUSTERED BY
和
SORTED BY
SORTED BY
子句指定数据的分布和排序方式,可以显著提升特定查询场景下的性能。
语法
CREATE TABLE table_name (
column_definitions
)
[CLUSTERED BY (col_name [, col_name ...]) [SORTED BY (col_name [ASC|DESC] [, ...])] INTO num BUCKETS]
[PARTITIONED BY (col_name data_type [, ...])];
参数说明
| 参数 | 必填 | 说明 |
|---|
CLUSTERED BY (col_name, ...)
CLUSTERED BY (col_name, ...) | 否 | 指定分桶键,系统对这些列的值做 Hash 运算,将数据分散到各分桶中 |
SORTED BY (col_name [ASC|DESC], ...)
SORTED BY (col_name [ASC|DESC], ...) | 否 | 指定桶内排序键,数据在每个分桶内按此顺序存储,默认升序 |
INTO num BUCKETS
INTO num BUCKETS | 与 CLUSTERED BY
CLUSTERED BY 配套 | 指定分桶数量,建议每个分桶的数据量在 128 MB–1 GB 之间 |
分桶键说明
分桶键决定数据如何分布到各个分桶(bucket)中。系统对分桶键列的值做 Hash 运算,相同 Hash 值的数据落入同一分桶。
选择分桶键的准则:
- 选择取值范围广、重复值少的列,使数据均匀分布,避免数据倾斜。
- 如果查询中频繁按某列做
JOIN
JOIN
,将该列设为分桶键可以实现 Bucket Join,显著提升 JOIN 性能。
- 未指定分桶键时,系统默认使用 256 个分桶。
- 分桶数量过多会产生大量小文件,影响元数据管理和 I/O 效率;分桶数量过少则无法充分利用并行处理能力。
排序键说明
排序键定义每个分桶内数据的物理排序方式。对于按排序键过滤或排序的查询,预排序的数据可以减少扫描范围,提升查询性能。
- 可为每个排序列指定
ASC
ASC
(升序,默认)或 DESC
DESC
(降序)。
- 排序键对写入性能有一定影响,大批量写入时排序会消耗额外资源。
使用示例
- 创建按
customer_id
customer_id
分桶、按 order_date
order_date
排序的订单表:
CREATE TABLE orders_clustered (
order_id BIGINT,
customer_id INT,
product STRING,
amount DECIMAL(10, 2),
order_date DATE
)
CLUSTERED BY (customer_id)
SORTED BY (order_date DESC)
INTO 64 BUCKETS;
按
customer_id
customer_id
查询时,系统只需扫描对应分桶,无需全表扫描:
SELECT * FROM orders_clustered WHERE customer_id = 1001;
- 创建多列分桶键的表,适合多维度 JOIN 场景:
CREATE TABLE transaction_records (
transaction_id BIGINT,
customer_id INT,
product_id INT,
amount DECIMAL(10, 2),
transaction_date DATE
)
CLUSTERED BY (customer_id, product_id)
SORTED BY (transaction_date ASC)
INTO 128 BUCKETS;
- 仅指定分桶键,不指定排序键:
CREATE TABLE sales_data (
sale_id INT,
product_id INT,
region STRING,
amount DECIMAL(10, 2)
)
CLUSTERED BY (product_id)
INTO 50 BUCKETS;
- 结合分区和分桶(分区表中的每个分区内再分桶):
CREATE TABLE logs_partitioned (
log_id BIGINT,
user_id INT,
action STRING,
log_time TIMESTAMP
)
PARTITIONED BY (log_date DATE)
CLUSTERED BY (user_id)
INTO 32 BUCKETS;
注意事项
SORTED BY
SORTED BY
必须与 CLUSTERED BY
CLUSTERED BY
配合使用,不能单独指定。
- 分桶数量建议根据数据量估算:目标是每个分桶约 128 MB–1 GB 数据。
- 分桶键和排序键在建表后不能通过
ALTER TABLE
ALTER TABLE
修改,需要重建表。
- 对于分区表,分桶是在每个分区内独立进行的,分桶数量对每个分区生效。