MaxCompute 推出Hologres类型的外部Schema,通过JDBC链路连接Hologres的Database实时获取元数据,通过JDBC或盘古文件直读的方式实时读取Hologres底层文件快照。
功能介绍
Hologres是一站式实时数据仓库引擎,支持海量数据实时写入、实时更新、实时分析,支持标准SQL(兼容PostgreSQL协议),支持PB级数据多维分析(OLAP)与即席分析(Ad Hoc),支持高并发低延迟的在线数据服务(Serving)。Hologres与MaxCompute深度融合,Hologres可以支持MaxCompute数仓上的OLAP模型的创建、分析和查询。MaxCompute支持创建Hologres外部数据源,通过与Hologres的联邦,可以实现以下场景:
超大规模数据仓库读取实时数仓的数据并归档。
读取维度数据或数据集市模型数据,与ODS、DWD、DWS层事实表关联计算。
读取OLAP模型数据进行高性能低成本离线计算,并将模型结果通过Hologres外部表或远端函数调用等方式返回给实时数仓进行分析。
Hologres类型的外部Schema在database.schema级别映射,通过RAM Role方式认证。用户首先在Hologres授权RAM Role,再到MaxCompute中指定RamRole映射Hologres Schema。在MaxCompute中,则通过MaxCompute权限体系基于对象名称管理外部Schema内映射的数据对象。
操作步骤
步骤一:准备测试数据
如有Hologres数据可忽略该步骤。
步骤二:创建Hologres外部数据源
登录MaxCompute控制台,在左上角选择地域。
在左侧导航栏,选择 。
在外部数据源页面,单击创建外部数据源。
在弹出的新增外部数据源对话框,根据界面提示配置相关参数。参数说明如下:
参数
是否必填
说明
外部数据源类型
必填
选择Hologres。
外部数据源名称
必填
可自定义命名。命名规则如下:
以字母开头,且只能包含小写字母、下划线和数字。
不能超过128个字符。
例如
holo_external_source。外部数据源描述
选填
根据需要填写。
连接方式
必填
默认为经典网络访问(内网)。
InstanceID
必填
选择当前地域下需要连接的Hologres实例。
Host
必填
系统默认生成。
Port
必填
系统默认生成。
DBNAME
必填
连接的Hologres数据库名称。
认证和鉴权
必填
选择云RAM角色。
创建Hologres外部schema,只支持阿里云RAM角色方式。
RoleARN
必填
RAM角色的ARN信息。
登录RAM控制台。
在左侧导航栏选择。
在基础信息区域,可以获取ARN信息。
示例:
acs:ram::124****:role/aliyunodpsdefaultrole。外部数据源补充属性
选填
特殊声明的外部数据源补充属性。指定后,使用此外部数据源的任务可以按照参数定义的行为访问源系统。
说明支持的具体参数请关注后续官网文档更新说明,具体参数将随产品能力演进逐步放开。
单击确认,完成外部数据源的创建。
步骤三:创建外部Schema
外部Schema操作需要在MaxCompute内部项目中执行,因此要求该内部项目必须已启用支持Schema层级开关
在左侧导航栏,选择。
在项目管理页面,单击目标项目操作列的升级到支持Schema层级。
需要在执行Schema操作或查询External Schema的数据前,开启SQL语法支持的Schema开关,即在SQL前增加
SET odps.namespace.schema=true;语句。在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_testSchema的orders表数据。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 | +------------+------------+------------+------------+------------+-------------+-------------+------------+