Hologres外部Schema

MaxCompute 推出Hologres类型的外部Schema,通过JDBC链路连接HologresDatabase实时获取元数据,通过JDBC或盘古文件直读的方式实时读取Hologres底层文件快照。

功能介绍

Hologres是一站式实时数据仓库引擎,支持海量数据实时写入、实时更新、实时分析,支持标准SQL(兼容PostgreSQL协议),支持PB级数据多维分析(OLAP)与即席分析(Ad Hoc),支持高并发低延迟的在线数据服务(Serving)。HologresMaxCompute深度融合,Hologres可以支持MaxCompute数仓上的OLAP模型的创建、分析和查询。MaxCompute支持创建Hologres外部数据源,通过与Hologres的联邦,可以实现以下场景:

  • 超大规模数据仓库读取实时数仓的数据并归档。

  • 读取维度数据或数据集市模型数据,与ODS、DWD、DWS层事实表关联计算。

  • 读取OLAP模型数据进行高性能低成本离线计算,并将模型结果通过Hologres外部表或远端函数调用等方式返回给实时数仓进行分析。

Hologres类型的外部Schemadatabase.schema级别映射,通过RAM Role方式认证。用户首先在Hologres授权RAM Role,再到MaxCompute中指定RamRole映射Hologres Schema。在MaxCompute中,则通过MaxCompute权限体系基于对象名称管理外部Schema内映射的数据对象。

操作步骤

步骤一:准备测试数据

如有Hologres数据可忽略该步骤。

创建Hologres实例并新建数据库

步骤二:创建Hologres外部数据源

  1. 登录MaxCompute控制台,在左上角选择地域。

  2. 在左侧导航栏,选择管理配置 > 外部数据源 。

  3. 外部数据源页面,单击创建外部数据源

  4. 在弹出的新增外部数据源对话框,根据界面提示配置相关参数。参数说明如下:

    参数

    是否必填

    说明

    外部数据源类型

    必填

    选择Hologres

    外部数据源名称

    必填

    可自定义命名。命名规则如下:

    • 以字母开头,且只能包含小写字母、下划线和数字。

    • 不能超过128个字符。

    例如holo_external_source

    外部数据源描述

    选填

    根据需要填写。

    连接方式

    必填

    默认为经典网络访问(内网)

    InstanceID

    必填

    选择当前地域下需要连接的Hologres实例。

    Host

    必填

    系统默认生成。

    Port

    必填

    系统默认生成。

    DBNAME

    必填

    连接的Hologres数据库名称。

    认证和鉴权

    必填

    选择RAM角色

    创建Hologres外部schema,只支持阿里云RAM角色方式。

    RoleARN

    必填

    RAM角色的ARN信息。

    1. 登录RAM控制台

    2. 在左侧导航栏选择身份管理 > 角色

    3. 基础信息区域,可以获取ARN信息。

    示例:acs:ram::124****:role/aliyunodpsdefaultrole

    外部数据源补充属性

    选填

    特殊声明的外部数据源补充属性。指定后,使用此外部数据源的任务可以按照参数定义的行为访问源系统。

    说明

    支持的具体参数请关注后续官网文档更新说明,具体参数将随产品能力演进逐步放开。

  5. 单击确认,完成外部数据源的创建。

步骤三:创建外部Schema

  1. 外部Schema操作需要在MaxCompute内部项目中执行,因此要求该内部项目必须已启用支持Schema层级开关

    1. 在左侧导航栏,选择管理配置 > 项目管理

    2. 项目管理页面,单击目标项目操作列的升级到支持Schema层级

  2. 需要在执行Schema操作或查询External Schema的数据前,开启SQL语法支持的Schema开关,即在SQL前增加SET odps.namespace.schema=true;语句。

  3. MaxCompute客户端中,使用如下命令创建引用了Hologres类型外部数据源的外部Schema:

    CREATE EXTERNAL SCHEMA IF NOT EXISTS <external_schema_name>
    with  <holo_foreign_server_name>
    ON '<holoschema_name>' ;

    参数说明如下:

    • external_schema_name:外部Schema名称。例如holo_schema_test。

    • holo_foreign_server_name:已创建的外部数据源名称。本示例为holo_external_source

    • holoschema_name:Hologres需要映射的Schema名称。本示例为public

步骤四:使用SQL访问数据源系统

  • 列出Hologres Schema中的表名称。

    • 方式1

      SHOW tables IN <external_schema_name>; --external_schema_name为外部Schema名称。
    • 方式2

      USE SCHEMA <external_schema_name>; --external_schema_name为外部Schema名称。
      SHOW tables;
  • 使用示例

    • 查询名称为holo_schema_test的外部Schema下的所有表名:

      SET odps.namespace.schema=true;
      USE SCHEMA holo_schema_test;
      SHOW TABLES;

      返回结果示例:

      ALIYUN$***_com:orders
      ALIYUN$***_com:orders_pay
      ALIYUN$***_com:product_catalog
    • 查询test项目中holo_schema_testSchemaorders表数据。

      SELECT * FROM test.holo_schema_test.orders;

      返回结果示例:

      +------------+------------+------------+------------+------------+-------------+-------------+------------+
      | order_id   | user_id    | shop_id    | product_id | buy_fee    | create_time | update_time | state      | 
      +------------+------------+------------+------------+------------+-------------+-------------+------------+
      | 100002     | user_002   | 12346      | 2          | 4000.04    | 2023-02-15 15:40:56 | 2023-02-15 18:42:56 | 1          | 
      | 100004     | user_001   | 12347      | 4          | 2000.02    | 2023-02-15 13:40:56 | 2023-02-15 18:42:56 | 1          | 
      | 100007     | user_003   | 12347      | 4          | 2000.02    | 2023-02-15 10:40:56 | 2023-02-15 18:42:56 | 1          | 
      | 100003     | user_003   | 12347      | 3          | 3000.03    | 2023-02-15 14:40:56 | 2023-02-15 18:42:56 | 1          | 
      | 100001     | user_001   | 12345      | 1          | 5000.05    | 2023-02-15 16:40:56 | 2023-02-15 18:42:56 | 1          | 
      | 100006     | user_001   | 12348      | 1          | 1000.01    | 2023-02-15 11:40:56 | 2023-02-15 18:42:56 | 1          | 
      | 100005     | user_002   | 12348      | 5          | 1000.01    | 2023-02-15 12:40:56 | 2023-02-15 18:42:56 | 1          | 
      +------------+------------+------------+------------+------------+-------------+-------------+------------+
    • 向表中插入数据。

      INSERT INTO test.holo_schema_test.orders VALUES(
        11111,
        'user_test',
        12346,
        2,
        4000.04,
        CAST('2025-12-15 00:00:00' AS TIMESTAMP),
        CAST('2025-12-15 00:00:00' AS TIMESTAMP),
        1);
      
      SELECT * FROM test.holo_schema_test.orders;

      返回结果示例:

      +------------+------------+------------+------------+------------+-------------+-------------+------------+
      | order_id   | user_id    | shop_id    | product_id | buy_fee    | create_time | update_time | state      | 
      +------------+------------+------------+------------+------------+-------------+-------------+------------+
      | 11111      | user_test  | 12346      | 2          | 4000.04    | 2025-12-15 00:00:00 | 2025-12-15 00:00:00 | 1          | 
      | 100002     | user_002   | 12346      | 2          | 4000.04    | 2023-02-15 15:40:56 | 2023-02-15 18:42:56 | 1          | 
      | 100004     | user_001   | 12347      | 4          | 2000.02    | 2023-02-15 13:40:56 | 2023-02-15 18:42:56 | 1          | 
      | 100001     | user_001   | 12345      | 1          | 5000.05    | 2023-02-15 16:40:56 | 2023-02-15 18:42:56 | 1          | 
      | 100006     | user_001   | 12348      | 1          | 1000.01    | 2023-02-15 11:40:56 | 2023-02-15 18:42:56 | 1          | 
      | 100005     | user_002   | 12348      | 5          | 1000.01    | 2023-02-15 12:40:56 | 2023-02-15 18:42:56 | 1          | 
      | 100003     | user_003   | 12347      | 3          | 3000.03    | 2023-02-15 14:40:56 | 2023-02-15 18:42:56 | 1          | 
      | 100007     | user_003   | 12347      | 4          | 2000.02    | 2023-02-15 10:40:56 | 2023-02-15 18:42:56 | 1          | 
      +------------+------------+------------+------------+------------+-------------+-------------+------------+
    • 从数据源将联邦外表orders的数据复制入数仓。

      MaxCompute不允许对来自外部Schema执行CREATE TABLE AS 操作,因此需要使用USE SCHEMA Default;Schema切换为Default,再执行如下语句:

      -- 将联邦外表的数据复制到数仓中
      CREATE TABLE orders_copy AS SELECT * FROM test.holo_schema_test.orders;
      
      -- 查询数仓中已复制的表数据
      SELECT * FROM orders_copy;

      返回结果示例:

      +------------+------------+------------+------------+------------+-------------+-------------+------------+
      | order_id   | user_id    | shop_id    | product_id | buy_fee    | create_time | update_time | state      | 
      +------------+------------+------------+------------+------------+-------------+-------------+------------+
      | 11111      | user_test  | 12346      | 2          | 4000.04    | 2025-12-15 00:00:00 | 2025-12-15 00:00:00 | 1          | 
      | 100003     | user_003   | 12347      | 3          | 3000.03    | 2023-02-15 14:40:56 | 2023-02-15 18:42:56 | 1          | 
      | 100006     | user_001   | 12348      | 1          | 1000.01    | 2023-02-15 11:40:56 | 2023-02-15 18:42:56 | 1          | 
      | 100005     | user_002   | 12348      | 5          | 1000.01    | 2023-02-15 12:40:56 | 2023-02-15 18:42:56 | 1          | 
      | 100001     | user_001   | 12345      | 1          | 5000.05    | 2023-02-15 16:40:56 | 2023-02-15 18:42:56 | 1          | 
      | 100007     | user_003   | 12347      | 4          | 2000.02    | 2023-02-15 10:40:56 | 2023-02-15 18:42:56 | 1          | 
      | 100002     | user_002   | 12346      | 2          | 4000.04    | 2023-02-15 15:40:56 | 2023-02-15 18:42:56 | 1          | 
      | 100004     | user_001   | 12347      | 4          | 2000.02    | 2023-02-15 13:40:56 | 2023-02-15 18:42:56 | 1          | 
      +------------+------------+------------+------------+------------+-------------+-------------+------------+