本文将为您介绍在Hologres中如何通过建外表的方式加速查询MaxCompute。

背景信息

大数据计算服务(MaxCompute,原名ODPS)是一种快速、完全托管的EB级数据仓库解决方案,致力于批量结构化数据的存储和计算,提供海量数据仓库的解决方案及分析建模服务。

Hologres是一款兼容PostgreSQL协议的实时交互式分析数仓,在底层与MaxCompute无缝打通,支持您以建外表的方式直接加速查询MaxComppute数据,无冗余存储,无数据导入导出操作,快速获取查询结果。同时您也可以将数据导入至交互式分析,相比其他非大数据生态产品,数据导入导出速度性能更佳。

针对不用的业务特性和场景,我们建议您根据以下两种场景来选择查询方式:

  • MaxCompute直接分析使用场景:首选方案,查询数据量小于100GB(经过分区过滤后,命中分区的大小,与查询相关字段的大小无关)。
  • MaxCompute导入查询使用场景:单表查询数据量大于100GB、复杂查询、含索引的查询、数据需更新、insert操作的场景。

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

  1. 准备MaxCompute非分区表数据
    您可以参考MaxCompute快速入门,创建表并导入数据,也可以直接选择已有的MaxCompute表。示例选用选择已有的MaxCompute表,其DDL如下:
    CREATE TABLE weather (
        city            STRING ,
        temp_lo         int,           -- 最低温度
        temp_hi         int         -- 最高温度
    );
    INSERT INTO weather VALUES 
    ('beijing',40,50),
    ('hangzhou',46,55);
  2. Hologres创建外部表
    在Hologres中创建一张外表,用于映射MaxCompute表数据。您可以选择部分字段查询,也可以选择全部字段查询。示例如下:
    CREATE FOREIGN TABLE weather1 (
     city text,
     temp_lo int8,
     temp_hi int8
    )
    SERVER odps_server
    OPTIONS (project_name '<odpsprojectname>',table_name 'weather');
    说明
    • SERVER:外部表服务器,Hologres已于底层创建,名为odps_server,无须用户创建,直接调用即可。详细原理请参见Postgres FDW
    • project_name:MaxCompute表所在的项目名称。
    • table_name:要查询的MaxCompute表名称。
    • 字段类型必须与MaxCompute字段类型保持一致,数据类型的映射关系可以参见:附录1:MaxCompute与Hologres的数据类型映射
    • 当MaxCompute project下表的schema发生变化时,交互式分析(Hologres)当前版本不会做schema的自动更新,由您自己负责更新。
    • 支持批量创建外部表,详情请见IMPORT FOREIGN SCHEMA
  3. 查询外部表
    外部表创建成功后,直接查询外部表,即可查询到MaxCompute的数据
    SELECT * FROM weather1;

示例2:MaxCompute分区表数据直接查询

  1. 准备Maxcompute分区表数据
    准备一张MaxCompute分区数据表,可参见MaxCompute分区表创建一张分区表。示例选用数据地图已有的分区表,其DDL如下:
    CREATE TABLE odps_test
    (
        shop_name     string,
        customer_id   string,
        total_price   INT 
    )
    PARTITIONED BY  (sale_date string);
    INSERT  overwrite table odps_test partition (sale_date='2013')values ('shop', '1234', 12);
    INSERT  overwrite table odps_test partition (sale_date='2014')values ('rest', '1111', 13);
    INSERT  overwrite table odps_test partition (sale_date='2015')values ('texy', '2222', 14);
  2. Hologres创建外部表
    在Hologres中创建一张外部表,用于映射MaxCompute中源头数据表。对于Hologres而言,外部表只用于字段映射,不存储数据,MaxCompute中的分区对应Hologres的一个字段。示例外部表的DDL如下:
    CREATE FOREIGN TABLE table_odps (
     shop_name text,
     customer_id text,
     total_price int8,
     sale_date text
    )
    SERVER odps_server
    OPTIONS (project_name '<odpsprojectname>', table_name 'odps_test');
  3. 查询分区表
    查询整张表,示例SQL如下。
    SELECT * FROM table_odps;
    查询分区数据,示例SQL如下。
    SELECT * FROM table_odps 
    WHERE sale_date = '2013';