【Doris-2.1.6】写入数据到hive 表提示:External catalog 'hive' is not allowed in 'AlterTableStmt'

Viewed 115

前置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插入。

2 Answers

在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
*/

set enable_nereids_dml=true;
set enable_fallback_to_original_planner=false;

再执行看看报啥错