在Doris中,为时间序列数据设计表结构时,自动分区功能能极大简化运维。本文将以创建Unique模型的表为例,详细演示如何实现按年自动分区,并进行完整的数据插入与分区信息验证。
建表过程
首先,我们创建一张支持自动按年分区的Unique模型表。其核心在于建表语句中的 AUTO PARTITION BY RANGE 子句。
-- 删除已存在的测试表(可选)
DROP TABLE IF EXISTS ADS.TEST_TABLE_1;
-- 创建支持自动按年分区的Unique模型表
CREATE TABLE IF NOT EXISTS ADS.TEST_TABLE_1
(BIZ_DATE datetime NOT NULL COMMENT '业务日期',
COMPANY_NAME VARCHAR(500) COMMENT '公司名称',
CREATED_TIME datetime(6) COMMENT “CREATED_TIME”)
UNIQUE KEY(BIZ_DATE,COMPANY_NAME)
COMMENT '测试表'
AUTO PARTITION BY RANGE (date_trunc(`BIZ_DATE`, 'year'))
()
DISTRIBUTED BY HASH(BIZ_DATE) BUCKETS 4
PROPERTIES ('enable_unique_key_merge_on_write' = 'true');
一、插入近20年测试数据
为了验证分区效果,我们向表中插入一批历史测试数据。这里使用 INSERT INTO 批量插入基于当前日期倒推20年(2006-2025年)的数据,每条数据的 BIZ_DATE 取每年12月31日,COMPANY_NAME 按年份命名,CREATED_TIME 与 BIZ_DATE 保持一致(精确到6位毫秒)。
INSERT INTO ADS.TEST_TABLE_1 (BIZ_DATE, COMPANY_NAME, CREATED_TIME)
VALUES
-- 2006-2025年,每年1条数据
('2006-12-31 23:59:59', '测试公司_2006', '2006-12-31 23:59:59.000000'),
('2007-12-31 23:59:59', '测试公司_2007', '2007-12-31 23:59:59.000000'),
('2008-12-31 23:59:59', '测试公司_2008', '2008-12-31 23:59:59.000000'),
('2009-12-31 23:59:59', '测试公司_2009', '2009-12-31 23:59:59.000000'),
('2010-12-31 23:59:59', '测试公司_2010', '2010-12-31 23:59:59.000000'),
('2011-12-31 23:59:59', '测试公司_2011', '2011-12-31 23:59:59.000000'),
('2012-12-31 23:59:59', '测试公司_2012', '2012-12-31 23:59:59.000000'),
('2013-12-31 23:59:59', '测试公司_2013', '2013-12-31 23:59:59.000000'),
('2014-12-31 23:59:59', '测试公司_2014', '2014-12-31 23:59:59.000000'),
('2015-12-31 23:59:59', '测试公司_2015', '2015-12-31 23:59:59.000000'),
('2016-12-31 23:59:59', '测试公司_2016', '2016-12-31 23:59:59.000000'),
('2017-12-31 23:59:59', '测试公司_2017', '2017-12-31 23:59:59.000000'),
('2018-12-31 23:59:59', '测试公司_2018', '2018-12-31 23:59:59.000000'),
('2019-12-31 23:59:59', '测试公司_2019', '2019-12-31 23:59:59.000000'),
('2020-12-31 23:59:59', '测试公司_2020', '2020-12-31 23:59:59.000000'),
('2021-12-31 23:59:59', '测试公司_2021', '2021-12-31 23:59:59.000000'),
('2022-12-31 23:59:59', '测试公司_2022', '2022-12-31 23:59:59.000000'),
('2023-12-31 23:59:59', '测试公司_2023', '2023-12-31 23:59:59.000000'),
('2024-12-31 23:59:59', '测试公司_2024', '2024-12-31 23:59:59.000000'),
('2025-12-31 23:59:59', '测试公司_2025', '2025-12-31 23:59:59.000000');
二、查询表分区的SQL
数据插入后,如何确认自动分区是否按预期工作?Doris 支持通过元数据表或直接查询来查看分区信息,以下是几种常用方法:
1. 查看分区元信息(推荐)
通过查询 INFORMATION_SCHEMA.PARTITIONS 系统表,可以获取详细的分区名称、范围、状态等信息。
-- 查询 Doris 元数据表(适用于所有版本)
SELECT *
FROM INFORMATION_SCHEMA.PARTITIONS
WHERE TABLE_SCHEMA = 'ADS' -- 数据库名
AND TABLE_NAME = 'TEST_TABLE_1'; -- 表名
2. 验证分区数据分布
通过按分区键(年份)进行分组查询,可以直观看到每个分区内的数据量。
-- 按分区键(年份)分组,查看每个分区的数据量
SELECT date_trunc('year', BIZ_DATE) AS PARTITION_YEAR, -- 分区对应的年份
COUNT(*) AS DATA_COUNT -- 每个分区的记录数
FROM ADS.TEST_TABLE_1
GROUP BY date_trunc('year', BIZ_DATE)
ORDER BY PARTITION_YEAR;
3. 查看分区的详细存储信息(可选)
使用 SHOW PARTITIONS 命令可以查看更详细的存储相关元信息,通常需要更高权限。
-- 查看分区的副本、存储路径等信息(需要管理员权限)
SHOW PARTITIONS FROM ADS.TEST_TABLE_1;
四、增量新增2026-2045年数据
自动分区的优势在于处理未来数据。现在,我们在原有2006-2025年数据基础上,增量插入2026-2045年的20条未来数据,规则保持一致。
INSERT INTO ADS.TEST_TABLE_1
(BIZ_DATE, COMPANY_NAME, CREATED_TIME)
VALUES
-- 2026-2045年,每年1条数据
('2026-12-31 23:59:59', '测试公司_2026', '2026-12-31 23:59:59.000000'),
('2027-12-31 23:59:59', '测试公司_2027', '2027-12-31 23:59:59.000000'),
('2028-12-31 23:59:59', '测试公司_2028', '2028-12-31 23:59:59.000000'),
('2029-12-31 23:59:59', '测试公司_2029', '2029-12-31 23:59:59.000000'),
('2030-12-31 23:59:59', '测试公司_2030', '2030-12-31 23:59:59.000000'),
('2031-12-31 23:59:59', '测试公司_2031', '2031-12-31 23:59:59.000000'),
('2032-12-31 23:59:59', '测试公司_2032', '2032-12-31 23:59:59.000000'),
('2033-12-31 23:59:59', '测试公司_2033', '2033-12-31 23:59:59.000000'),
('2034-12-31 23:59:59', '测试公司_2034', '2034-12-31 23:59:59.000000'),
('2035-12-31 23:59:59', '测试公司_2035', '2035-12-31 23:59:59.000000'),
('2036-12-31 23:59:59', '测试公司_2036', '2036-12-31 23:59:59.000000'),
('2037-12-31 23:59:59', '测试公司_2037', '2037-12-31 23:59:59.000000'),
('2038-12-31 23:59:59', '测试公司_2038', '2038-12-31 23:59:59.000000'),
('2039-12-31 23:59:59', '测试公司_2039', '2039-12-31 23:59:59.000000'),
('2040-12-31 23:59:59', '测试公司_2040', '2040-12-31 23:59:59.000000'),
('2041-12-31 23:59:59', '测试公司_2041', '2041-12-31 23:59:59.000000'),
('2042-12-31 23:59:59', '测试公司_2042', '2042-12-31 23:59:59.000000'),
('2043-12-31 23:59:59', '测试公司_2043', '2033-12-31 23:59:59.000000'),
('2044-12-31 23:59:59', '测试公司_2044', '2044-12-31 23:59:59.000000'),
('2045-12-31 23:59:59', '测试公司_2045', '2045-12-31 23:59:59.000000');
请注意:上面第18行数据中CREATED_TIME的值'2033-...'疑似笔误,应为'2043-...',请根据实际情况修正。
五、查询全量40年分区数据
插入未来数据后,我们需要验证新增的2026-2045年分区是否被自动创建,以及数据是否正确写入。
1. 查看全量分区元信息
再次查询分区元数据表,此时应能看到从2006年到2045年的所有年度分区。
SELECT *
FROM INFORMATION_SCHEMA.PARTITIONS
WHERE TABLE_SCHEMA = 'ADS' AND TABLE_NAME = 'TEST_TABLE_1'
ORDER BY PARTITION_NAME; -- 按年份升序排列
2. 验证全量40年数据分布
通过一个汇总查询,可以清晰看到每个年份分区的数据统计情况。
SELECT
DATE_TRUNC('year', BIZ_DATE) AS PARTITION_YEAR, -- 分区年份(格式:yyyy-01-01 00:00:00)
YEAR(BIZ_DATE) AS YEAR, -- 提取纯年份(便于阅读)
COUNT(*) AS DATA_COUNT, -- 每个年份的数据量(应均为1)
MAX(COMPANY_NAME) AS COMPANY_NAME -- 对应公司名称
FROM ADS.TEST_TABLE_1
GROUP BY DATE_TRUNC('year', BIZ_DATE), YEAR(BIZ_DATE)
ORDER BY YEAR; -- 按年份升序显示(2006-2045)
3. 快速查询新增2026-2045年数据
也可以直接查询未来时间范围的数据,以验证插入操作是否成功。
-- 直接查询2026-2045年的所有数据,验证是否插入成功
SELECT BIZ_DATE, COMPANY_NAME, CREATED_TIME
FROM ADS.TEST_TABLE_1
WHERE YEAR(BIZ_DATE) BETWEEN 2026 AND 2045
ORDER BY BIZ_DATE;
通过以上步骤,我们完成了从建表、历史数据插入、分区验证到未来数据增量写入的全流程。这种自动分区策略非常适合需要按时间维度管理大量历史与实时数据的场景,能有效提升数据管理效率。
本文演示了Doris自动分区的核心操作,更多高级特性和性能调优技巧,欢迎在云栈社区交流探讨。