Doris 的动态分区(dynamic partition)默认支持的分区字段格式是标准的DATE或DATETIME类型,但你提到的yyyy-MM(即只有年月,没有日)的格式属于不完整日期(非标准 DATE 类型),不能直接用作分区字段。
但可以通过以下方法间接实现以年月为粒度的分区。
一、推荐方式:使用DATE字段 + 动态分区,按月分区
虽然不能直接用yyyy-MM,但你可以用DATE类型字段(例如2024-05-01),然后通过动态分区的 granularity 为 MONTH的方式实现「按月分区」。
示例:
CREATE TABLE example_table ( id INT, event_time DATE ) DISTRIBUTED BY HASH(id) BUCKETS 10 PARTITION BY RANGE(event_time) () PROPERTIES ( "dynamic_partition.enable" = "true", "dynamic_partition.time_unit" = "MONTH", "dynamic_partition.start" = "-12", "dynamic_partition.end" = "3", "dynamic_partition.prefix" = "p", "dynamic_partition.buckets" = "10", "dynamic_partition.create_history_partition" = "true" );
效果:
会自动创建如下分区:
| 分区名 | 分区范围(event_time) |
|---|---|
| p202405 | [2024-05-01, 2024-06-01) |
| p202406 | [2024-06-01, 2024-07-01) |
你在写入数据时,只需往event_time列写入标准的DATE类型值(如2024-05-10),Doris 会自动路由到对应分区p202405。
二、如果你的原始数据字段是yyyy-MM字符串格式
你需要:
- 在写入时用 SQL 转换成
DATE类型; - 或者使用视图或计算列。
示例:将yyyy-MM字符串转换为DATE
-- 假设有个 staging 表字段是 "2024-05" SELECT STR_TO_DATE(CONCAT(partition_ym, '-01'), '%Y-%m-%d') AS event_time FROM staging_table;
然后写入主表中。
🚫 不推荐:直接使用字符串yyyy-MM作为分区字段
虽然技术上可以用VARCHAR字段做 RANGE 分区,但:
- 无法使用动态分区功能(只支持
DATE/DATETIME字段); - 不能使用时间函数做范围推导、自动创建分区等操作;
- 写入和查询逻辑不直观、不易维护。