doris的动态分区,可以yyyy-MM这种年月格式的日期格式来做为分区吗
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
字段); - 不能使用时间函数做范围推导、自动创建分区等操作;
- 写入和查询逻辑不直观、不易维护。