针对部分业务数据规模大(大于100GB)、查询query复杂度高且查询要求秒级响应的场景,Hologres支持MaxCompute数据直接导入查询,相比其他工具需要数据导入导出节省了大量中间转化成本。本文将为您介绍如何使用命令语句将MaxCompute数据导入Hologres

示例1:MaxCompute非分区数据导入查询

  1. 准备MaxCompute非分区表数据
    在MaxCompute中创建一张非分区源头数据表,也可以直接选用数据地图中的一张非分区表。示例选数据地图中的一张表,其DDL如下。

    CREATE TABLE odps_test1(     id int,     name STRING ,     class STRING  ); INSERT INTO odps_test1 VALUES  (1,'Tom','class3'), (2,'Neal','class4'), (3,'Tony','class4'), (4,'David','class5');

  2. Hologres中创建一张外部表

    在Hologres中创建一张外部表,用于映射MaxCompute中的源头数据表。

    阿里云2000元代金券免费领,最新优惠1折抢购,2核4G云服务器仅799元/3年,新老用户同享,立即抢购>>>

    CREATE FOREIGN TABLE holo_test1 (  id int8,  name text,  class text ) SERVER odps_server OPTIONS (project_name '<odpsprojectname>', table_name 'odps_test1');
    说明

    • server为外部表服务器,Hologres已在底层封装,名为odps_server,无须用户创建直接调度即可,详细原理参见Postgres FDW
    • project_name:MaxCompute表所在的项目名称。
    • table_name:要查询的MaxCompute表名称。
    • 外部表的字段类型需要同MaxCompute字段类型保持一致,数据类型的映射关系可以参见附录1:MaxCompute与交互式分析的数据类型映射

  3. Hologres建立一张真实存储表

    在Hologres中建立一张真实存储表,用于接收MaxCompute源头表数据,真实存储表的字段类型需要与MaxCompute表保持一致。示例如下。

    CREATE TABLE holo_test2 (  id int8,  name text,  class text );
  4. 导入数据至Hologres
    使用INSERT语句将MaxCompute数据导入至Hologres,示例如下。

    INSERT INTO holo_test2 SELECT  id as id, name as name, class as class FROM holo_test1;

  5. Hologres查询MaxCompute表数据
    输入查询语句,即可在Hologres中查询MaxCompute表导入的数据,示例如下。

    SELECT * FROM holo_test2;

示例2:MaxCompute分区数据导入查询

  1. 准备MaxCompute分区数据表
    在MaxCompute中准备一张分区数据表,可参见MaxCompute分区表创建一张分区表。示例选用数据地图中已有的一张分区表,其DDL如下:

     CREATE TABLE odps_test2 (     shop_name     string,     customer_id   string,     total_price   INT  ) PARTITIONED BY (sale_date string); INSERT  overwrite table odps_test2 partition (sale_date='2013')values ('shop', '1234', 12); INSERT  overwrite table odps_test2 partition (sale_date='2014')values ('rest', '1111', 13); INSERT  overwrite table odps_test2 partition (sale_date='2015')values ('texy', '2222', 14);

  2. Hologres建立一张外部表
    在Hologres中建立一张外部表,用于映射MaxCompute源头数据表,示例DDL如下。

    CREATE FOREIGN TABLE table1_odps (  shop_name text,  customer_id text,  total_price int8,  sale_date text ) SERVER odps_server OPTIONS (project_name '<odpsprojectname>', table_name 'odps_test2');

  3. Hologres建立一张真实存储表
    在Hologres中建立一张真实存储数据的表,用于接收MaxCompute导入的数据。MaxCompute的分区无Hologres的分区无强映射关系,您可以将MaxCompute的分区表数据导入Hologres分区表/非分区表中,本次示例导入到Hologres分区表中,示例如下:

    CREATE TABLE table1_holo (  shop_name text,  customer_id text,  total_price int8,  sale_date text ) PARTITION BY LIST (sale_date);

    说明 :MaxCompute是否分区与Hologres是否分区无强关联。

    1. MaxCompute分区表可以全部insert into一张Hologres非分区表。
    2. MaxCompute分区表也可以insert into一张Hologres分区表,分区之间一一映射。
    3. Hologres暂时不支持多级分区,所以MaxCompute多级分区到Hologres改成非分区或者一级分区即可。

  4. 创建子分区
    在Hologres中创建一张分区子表,用于接收对应的分区数据,示例DDL如下。

    CREATE TABLE  table1_holo_0001 PARTITION  of table1_holo for VALUES  in ('2015');

  5. 导入数据至Hologres

    使用INSERT语句将MaxCompute数据导入至Hologres对应的分区子表中,示例如下。

    INSERT INTO table1_holo_0001 SELECT  shop_name as shop_name,  customer_id as customer_id,  total_price as total_price,  sale_date as sale_date  from table1_odps  WHERE sale_date = '2015';
  6. 查询数据
    在Hologres查询导入的数据,示例如下。

    SELECT * FROM table1_holo;