目前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 新创建的临时表名称。

表名称也可以使用Schema.Table格式。

table 已存在的表名称。

表名称也可以使用Schema.Table格式。

临时表DDL 创建临时表有如下两种方式。
  • 通过复制已有表创建新表的结构
    SET hg_experimental_enable_create_table_like_properties=on;
    CALL HG_CREATE_TABLE_LIKE ('<table_new>', 'select * from <table>');
  • 新建表的结构
    CREATE TABLE IF NOT EXISTS <table_new> ([
      {
       column_name column_type [column_constraints, [...]]
       | table_constraints
       [, ...]
      }
    ]);
    
    CALL set_table_property('<table_new>', property, value);

使用示例

  • 场景一: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;