目前Hologres暂不支持INSERT OVERWRITE命令,本文为您介绍在Hologres中如何使用SQL实现INSERT OVERWRITE的功能。
命令格式
您可以使用如下SQL语句实现INSERT OVERWRITE的功能。
BEGIN ;
-- 清理潜在的临时表
DROP TABLE IF EXISTS <table_new>;
-- 创建临时表
SET hg_experimental_enable_create_table_like_properties=on;
CALL HG_CREATE_TABLE_LIKE ('<table_new>', 'select * from <table>');
COMMIT ;
-- 向临时表插入数据
INSERT INTO <table_new> [( <column> [, ...] )]
VALUES ( {<expression>} [, ...] )
[, ...] | <query>}
ANALYZE <table_new>;
BEGIN ;
-- 删除旧表
DROP TABLE IF EXISTS <table>;
-- 临时表改名
ALTER TABLE <table_new> RENAME TO <table>;
COMMIT ;
参数说明
参数 | 说明 |
---|---|
table_new | 新创建的临时表名称。
表名称也可以使用 |
table | 已存在的表名称。
表名称也可以使用 |
临时表DDL | 创建临时表有如下两种方式。
|
使用示例
- 场景一:MaxCompute向Hologres的非分区表导入数据
在MaxCompute向Hologres导入数据的场景中,希望将数据全量覆盖,常见于离线加工后的结果表导出为线上服务表。此场景使用示例如下所示,将MaxCompute中的odps_region_10g表的数据写入Hologres的region表中,且将Hologres中region表的数据全量覆盖。
-- 刷新外表的Schema IMPORT FOREIGN SCHEMA holo_demo LIMIT to ( odps_region_10g ) FROM SERVER odps_server INTO public OPTIONS(if_table_exist 'update',if_unsupported_type 'error'); BEGIN ; -- 清理潜在的临时表 DROP TABLE IF EXISTS public.region_new; -- 创建临时表 SET hg_experimental_enable_create_table_like_properties=on; CALL HG_CREATE_TABLE_LIKE ('public.region_new', 'select * from public.region'); COMMIT ; -- 向临时表插入数据 INSERT INTO public.region_new SELECT * FROM public.odps_region_10g; ANALYZE public.region_new; BEGIN ; -- 删除旧表 DROP TABLE IF EXISTS public.region; -- 临时表改名 ALTER TABLE IF EXISTS public.region_new RENAME TO region; COMMIT ;
- 场景二:MaxCompute向Hologres的分区表导入数据
在每天定期更新MaxCompute分区表的数据,且需要将MaxCompute分区表向Hologres的分区表导入数据的场景中,希望将数据全量覆盖,实现离线数据对实时数据的修正。此场景使用示例如下所示,将MaxCompute中的odps_lineitem_10g表的数据写入Hologres的lineitem表中,且全量覆盖Hologres中lineitem表的数据,两个表都是按照ds字段按天分区。
-- 刷新外表的Schema IMPORT FOREIGN SCHEMA holo_demo LIMIT to ( odps_lineitem_10g ) FROM SERVER odps_server INTO public OPTIONS(if_table_exist 'update',if_unsupported_type 'error'); BEGIN ; -- 清理潜在的临时表 DROP TABLE IF EXISTS public.lineitem_new_20210101; -- 创建临时表 SET hg_experimental_enable_create_table_like_properties=on; CALL HG_CREATE_TABLE_LIKE ('public.lineitem_new_20210101', 'select * from public.lineitem'); COMMIT ; -- 向临时表插入数据 INSERT INTO public.lineitem_new_20210101 SELECT * FROM public.odps_lineitem_10g WHERE DS = '20210101' ANALYZE public.lineitem_new_20210101; BEGIN ; -- 删除旧分区 DROP TABLE IF EXISTS public.lineitem_20210101; -- 临时表改名 ALTER TABLE public.lineitem_new_20210101 RENAME TO lineitem_20210101; -- 将临时表绑定至指定分区表 ALTER TABLE public.lineitem ATTACH PARTITION lineitem_20210101 FOR VALUES IN ('20210101'); COMMIT ;
- 场景三:Hologres向MaxCompute的非分区表导入数据
如果您需要从Hologres向MaxCompute的非分区表导入数据,建议采用临时表导入的方式,导入完成后将临时表改名为正式表即可。此场景使用示例如下所示,将Hologres中holotable表的数据写入MaxCompute的mc_holotable表中,且将MaxCompute的mc_holotable表数据全量覆盖。
-- 在MC中创建目标表的临时表 CREATE TABLE if not exists mc_holotable_temp( age int, job string, name string ); -- 在Hologres中创建临时表的映射 CREATE FOREIGN TABLE "public"."mapping_holotable_temp" ( "age" int, "job" text, "name" text ) SERVER odps_server OPTIONS (project_name 'DLF_test',table_name 'mc_holotable_temp'); -- 在Hologres中更新原始表 update holotable set "job" = 'president' where "name" = 'Lily'; -- 将更新后的数据写入临时表的映射 insert into mapping_holotable_temp select * from holotable; -- 在MaxCompute中删除旧的目标表 DROP TABLE IF EXISTS mc_holotable; -- 临时表更名为目标表即可 ALTER TABLE mc_holotable_temp RENAME TO mc_holotable;
说明 导入数据支持部分导入和全表导入两种方式:- 导出部分字段示例:
insert into mapping_holotable_temp select x,x,x from holotable; --x,x,x可以替换为您需要导出的字段名
- 导出全部字段示例:
insert into mapping_holotable_temp select * from holotable;
- 导出部分字段示例: