insert overwrite 支持动态分区

目前

create table test_overwrite(a int not null , b int, c int)
duplicate key (a)
partition by (a)

insert into test_overwrite values(1,2,1),(2,2,2),(3,3,3);
select * from test_overwrite;

insert overwrite test_overwrite partition (p1,p2,p3) select * from test_overwrite union all select 4,4,4;

报错: Error: The row is out of partition ranges. Please add a new partition… Row: [4, 4, 4]
动态分区为什么不能动态的新增分区呢

看建表语句中没有指定动态分区dynamic partition相关配置,相关配置可参考 https://docs.starrocks.io/zh/docs/table_design/dynamic_partitioning/

这种写法是 列表达式分区的写法,当前列表达式分区不支持数据导入时自动创建分区,可以考虑在建表时手动创建分区,或者使用 range分区方式+dynamic partition 动态创建分区

这种分区 在insert into时可以自动创建分区, 但是overwrite 分区时不行. 可不可以支持 overwrite分区时 写入数据时 没有分区自动创建分区
并且 insert overwrite select 的时候 自动根据查询中包含的分区 指定覆盖要写入的分区.
这个功能在业务层面实现很复杂, 数据开发人员无法指定分区名
下面这个是maxCompute的sql 分区覆盖功能比较好用

insert overwrite table sale_detail_dypart partition (sale_date='2013', region)

不支持类似hive的自动分区,我觉得这个功能挺实用的。
特别是在做增量导数数据的时候。希望社区后面版本能考虑下如何优化这块的特性。

2赞

是的, hive 和 maxCompute在这方面支持的比较好, 希望starrocks也能提供

partition(这里不支持函数 也不能用变量 ) 这难受了。 动态分区 支持一波吧

1赞
create table test_overwrite(a date not null , b int, c int)
duplicate key (a)
PARTITION BY RANGE(a)(
PARTITION p20240828 VALUES LESS THAN ("2024-08-28"),
PARTITION p20240829 VALUES LESS THAN ("2024-08-29"),
PARTITION p20240830 VALUES LESS THAN ("2024-08-30")
)
PROPERTIES(
    "dynamic_partition.enable" = "true",
    "dynamic_partition.time_unit" = "DAY",
    "dynamic_partition.start" = "-3",
    "dynamic_partition.end" = "3",
    "dynamic_partition.prefix" = "p",
    "dynamic_partition.history_partition_num" = "0"
);

show partitions from test_overwrite;
select tracking_log from information_schema.load_tracking_logs where job_id=41737
insert into test_overwrite values('2024-08-27',2,1),('2024-08-28',2,2),('2024-08-29',3,3);
select * from test_overwrite;

insert overwrite test_overwrite partition (p20240828,p20240829,p20240830) select * from test_overwrite union all select '2024-08-30',4,4;

这样也不行
写入时不会动态创建分区的
Error: The row is out of partition ranges. Please add a new partition… Row: [2024-08-30, 4, 4]

range本身不会动态给你创建分区的,它的动态分区我理解是指每天帮你创建dynamic_partition.end数目的分区数,相当于给你创建未来的分区,并不会因为你导入时,分区不存在自动帮你创建,所以它的分区概念有误导效果

以及它会帮你自动清理分区,达成数据生命周期的治理效果,推荐你在导入时,根据你导入的数据,手动创建一些分区,确保你导入时分区存在即可