针对部分业务数据规模大(大于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中的源头数据表。

    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;