修改表分区

更新时间:
复制为 MD 格式

本文详细说明列存表的存储架构、分区机制及分区修改操作,帮助用户高效管理数据分布。

列存的存储结构

列存表采用两层存储设计:

  • DeltaStore:实时写入数据的内存暂存区。

  • Base:持久化存储层,通过定期Dump操作将DeltaStore数据转储至此。

分区机制详解

以下方建表语句为例:

CREATE TABLE t1 (
  device_id VARCHAR NOT NULL, 
  region VARCHAR NOT NULL, 
  ts TIMESTAMP NOT NULL, 
  temperature DOUBLE, 
  humidity BIGINT,
  PRIMARY KEY(device_id, region, ts)
)
PARTITION BY LIST(bucket(100, device_id)) 
WITH (EngineType=`COLUMN`, 'column.engine.num_regions'='10');

核心分区配置:

  • 分区键:PARTITION BY LIST(bucket(100, device_id) 将数据按device_id分成100个逻辑分区。

  • Base层存储:每一份就是一个分区。不同分区存储在不同的文件中。

  • DeltaStore优化:将这100份数据用column.engine.num_regions=10二次哈希分成10Region,每个region表示一个分区,以提升内存利用率。

修改表的分区

DeltaStore

通过修改表属性来更改分区数。目前仅支持增加region的数量,若new_region_num比之前的值更小,则会抛异常。

ALTER TABLE tableName SET `column.engine.num_regions` = new_region_num;

可通过SHOW TABLE VARIABLES FROM tableName LIKE 'column.engine.num_regions';查看region的数量。

Base

通过修改分区规则来调整分区。

-- 修改表tableName的分区数,将数据按device_id修改为分成200个逻辑分区。
ALTER TABLE tableName PARTITION BY LIST(bucket(200, device_id));

-- 修改表tableName的分区策略,按ts和device_id两级维度进行数据分区。
ALTER TABLE tableName PARTITION BY LIST(`month`(ts), `bucket`(256, device_id));

分区信息查询

可以通过SQL查看表的分区规则。

SHOW TABLE VARIABLES FROM tableName LIKE 'PARTITION_KEY';