本文详细说明列存表的存储架构、分区机制及分区修改操作,帮助用户高效管理数据分布。
列存的存储结构
列存表采用两层存储设计:
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二次哈希分成10个Region,每个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';该文章对您有帮助吗?