分桶键(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
    (降序)。
  • 排序键对写入性能有一定影响,大批量写入时排序会消耗额外资源。

使用示例

  1. 创建按
    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;

  1. 创建多列分桶键的表,适合多维度 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;

  1. 仅指定分桶键,不指定排序键:

CREATE TABLE sales_data ( sale_id INT, product_id INT, region STRING, amount DECIMAL(10, 2) ) CLUSTERED BY (product_id) INTO 50 BUCKETS;

  1. 结合分区和分桶(分区表中的每个分区内再分桶):

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
    修改,需要重建表。
  • 对于分区表,分桶是在每个分区内独立进行的,分桶数量对每个分区生效。
联系我们
预约咨询
微信咨询
电话咨询
邮件咨询