前置sql:
switch hive;
INSERT OVERWRITE TABLE temp.ads_pmt_wip_produce_statistics_dtl PARTITION(dt)
SELECT c_wip.org_id
,c_wip.org_code
.....
错误信息:External catalog 'hive' is not allowed in 'AlterTableStmt'
备注:Doris-2.1.3版本可以执行该sql插入。
前置sql:
switch hive;
INSERT OVERWRITE TABLE temp.ads_pmt_wip_produce_statistics_dtl PARTITION(dt)
SELECT c_wip.org_id
,c_wip.org_code
.....
错误信息:External catalog 'hive' is not allowed in 'AlterTableStmt'
备注:Doris-2.1.3版本可以执行该sql插入。
在Doris中执行向Hive插入数据的逻辑实现,与 Hive 行为保持一致,但未支持指定分区覆盖。
建议:
修改hql,全部使用动态分区方式(直接把指定分区的部分删掉,即删除 PARTITION(dt))进行覆盖,这样的话,不仅doris可用,后续升级hive到高版本时也可以直接使用(低版本的hive的动态分区默认是关闭的,hive3版本的动态分区默认是打开的)。
针对上诉问题,可以使用如下SQL写法:
switch hive;
INSERT OVERWRITE TABLE temp.ads_pmt_wip_produce_statistics_dtl
SELECT c_wip.org_id
,c_wip.org_code
.....
对 Hive表 INSERT OVERWRITE TABLE 逻辑的完整演示:
-- Hive表当前数据,有2024-10-23的分区
select * from hive.hive_sdb.dept_partition;
/*
1 zs sz 2024-10-23
* */
-- Doris 内表数据,有 10-14 和 10-15 两个分区
insert into internal.ndong.dept_partition
values(1,'ssd','sddd','2024-10-14')
,(2,'sdd','dff','2024-10-14')
,(3,'sdd','dff','2024-10-15');
-- 内表数据插入Hive,OVERWRITE没有覆盖2024-10-23的数据, 行为表现上是分区级别的覆盖,与Hive行为一致
insert OVERWRITE table hive.hive_sdb.dept_partition
select * from internal.ndong.dept_partition
;
select * from hive.hive_sdb.dept_partition;
/*
1 ssd sddd 2024-10-14
2 sdd dff 2024-10-14
3 sdd dff 2024-10-15
1 zs sz 2024-10-23
* */
-- 另外一个Doris内表,有 10-16 和 10-23 两个分区
insert into internal.ndong.dept_partition2
values(1,'ssd','sddd','2024-10-23')
,(2,'sdd','dff','2024-10-23')
,(3,'sdd','dff','2024-10-16');
-- 将另外一个内表数据插入Hive
insert OVERWRITE table hive.hive_sdb.dept_partition
select * from internal.ndong.dept_partition2
;
-- 内表数据插入Hive,OVERWRITE覆盖了Hive中 10-16 和 10-23 两个分区,14和15号的数据还在, 行为表现上是分区级别的覆盖,与Hive行为一致
select * from hive.hive_sdb.dept_partition;
/*
1 ssd sddd 2024-10-14
2 sdd dff 2024-10-14
3 sdd dff 2024-10-15
3 sdd dff 2024-10-16
1 ssd sddd 2024-10-23
2 sdd dff 2024-10-23
*/