本文介绍如何创建Hologres外部表,以及如何在外部表建表语句中指定Hologres数据源、STS认证信息或打开双签名开关、映射目标表、JDBC驱动信息。
功能介绍
Hologres是兼容PostgreSQL协议的实时交互式分析数据仓库,在底层与MaxCompute无缝连接。通过在MaxCompute上创建Hologres外部表,可以实现基于PostgreSQL JDBC驱动及STS认证信息查询Hologres数据源的数据。该方式无冗余存储,无需导入导出数据,可实现快速获取查询结果。
适用范围
数据操作(DML)
MaxCompute不支持对创建的Hologres外部表执行更新(UPDATE)、删除(DELETE)操作。
不支持对Hologres外部表执行INSERT OVERWRITE操作:
从Hologres侧读取Hologres映射MaxCompute的外表,通过Hologres的INSERT OVERWRITE语义完成从MaxCompute到Hologres的数据覆盖写入,详情请参见INSERT OVERWRITE。
数据写入风险
当向Hologres外部表写入大量数据时,由于采用并行多进程写入,会存在小概率某个写入进程数据重写的情况,从而导致数据重复。
分区
Hologres的分区表和MaxCompute的分区表没有对应关系。Hologres外部表不支持分区,但直读模式下,查询MaxCompute的Hologres外部表映射Hologres的分区父表时,查询条件匹配分区子表的分区列,可以进行分区裁剪。
Hologres外部表不支持cluster属性。
Hologres外部表不支持映射Hologres的Dynamic Table。
支持数据类型
DECIMAL类型限制:
在MaxCompute中创建的Hologres外部表,
DECIMAL数据类型默认且固定为decimal(38,18),不能修改。如果源表小数位数较少,可以在MaxCompute外部表中将该列定义为STRING类型,在使用时再通过CAST函数强制转换。复杂类型限制:
MaxCompute创建的Hologres外部表,不支持
Array,Map,Struct等复杂数据类型。其他不兼容类型:
Hologres中的
MONEY等数据类型,目前在MaxCompute中没有对应的数据类型,暂时不支持。
详情如下表所示:
Hologres数据类型 | MaxCompute数据类型 | JDBC读 | JDBC写 | 直读(odps.table.api.enable.holo.table=true) | 说明 |
INTEGER(别名INT或INT4) | INT |
|
|
| 32位有符号整型。 |
TEXT | STRING、VARCHAR |
|
|
| 字符串类型,目前长度限制为8 MB。 |
SMALLINT | SMALLINT |
|
|
| 16位有符号整型。 |
INT2 | SMALLINT |
|
|
| 16位有符号整型。 |
BIGINT(别名INT8) | BIGINT |
|
|
| 64位有符号整型。 |
BYTEA | BINARY |
|
|
| 二进制数据类型,目前长度限制为8 MB。Hologres的 |
REAL(别名FLOAT4) | FLOAT |
|
|
| 32位二进制浮点型。 |
DOUBLE PRECISION(别名FLOAT8) | DOUBLE |
|
|
| 64位二进制浮点型。 |
BOOLEAN(别名BOOL) | BOOLEAN |
|
|
| BOOLEAN类型。 |
TIMESTAMP | TIMESTAMP_NTZ |
|
|
| 存储精度为纳秒,存在时区的时间误差。 Hologres的TIMESTAMP类型不包含时区,存储精度为微秒。 |
TIMESTAMP WITH TIME ZONE(别名TIMESTAMPTZ) | TIMESTAMP |
|
|
| 时间戳类型,精确到纳秒,格式为 MaxCompute与Hologres在底层已经进行了精度转换。MaxCompute输出不包含时区格式。 |
DECIMAL(别名NUMERIC) | DECIMAL(precision,scale) |
|
|
| 10进制精确数字类型。
MaxCompute的DECIMAL如果未指定精度,则默认为 |
CHAR(n) | CHAR(n) |
|
|
| MaxCompute的 Hologres的 |
VARCHAR(n) | VARCHAR(n) |
|
|
| MaxCompute的 Hologres的 |
DATE | DATE |
|
|
| 日期类型,格式为 |
INT4[] | ARRAY<INT> |
|
|
| 复杂类型ARRAY。 |
INT8[] | ARRAY<BIGINT> |
|
|
| |
FLOAT4[] | ARRAY<FLOAT> |
|
|
| |
FLOAT8[] | ARRAY<DOUBLE> |
|
|
| |
BOOLEAN[] | ARRAY<BOOLEAN> |
|
|
| |
TEXT[] | ARRAY<STRING> |
|
|
| |
JSONB | JSON |
|
|
| 复杂类型 JSON,直读模式支持。 |
JSON | STRING |
|
|
| 字符串类型,目前长度限制为8 MB。JDBC模式支持Hologres的JSON类型。 |
SERIAL(自增序列) | INT |
|
|
| Hologres的自增序列字段,MaxCompute可用INT类型接收,但写入时无法实现自增功能。 |
RoaringBitmap | 不支持 |
|
|
| MaxCompute侧没有映射的类型。 |
RoaringBitmap64 | 不支持 |
|
|
| MaxCompute侧没有映射的类型。 |
BIT(n) | 不支持 |
|
|
| MaxCompute侧没有映射的类型。 |
VARBIT(n) | 不支持 |
|
|
| MaxCompute侧没有映射的类型。 |
INTERVAL | 不支持 |
|
|
| MaxCompute侧没有映射的类型。 |
TIMETZ | 不支持 |
|
|
| MaxCompute侧没有映射的类型。 |
TIME | 不支持 |
|
|
| MaxCompute侧没有映射的类型。 |
INET | 不支持 |
|
|
| MaxCompute侧没有映射的类型。 |
MONEY | 不支持 |
|
|
| MaxCompute侧没有映射的类型。 |
OID | 不支持 |
|
|
| MaxCompute侧没有映射的类型。 |
UUID | 不支持 |
|
|
| MaxCompute侧没有映射的类型。 |
创建Hologres外部表
可以通过如下两种方式创建Hologres外部表:STS模式和双签名模式。
注意事项
外部表创建规范
如果Hologres开启了IP白名单功能,用户需要采用双签名模式创建Hologres外部表。如果用STS模式创建Hologres外部表,MaxCompute访问Hologres时会被IP白名单拦截。
对于Hologres的父表、子表,Hologres外部表中会指定表名,并执行SQL语句。父表、子表都可以映射至Hologres外部表,但是父表只能读不能写。
向Hologres外部表写入数据时,暂不支持Hologres的INSERT ON CONFLICT(UPSERT)机制。如果Hologres源表有主键,请避免写入的数据与Hologres源表中的数据产生主键唯一性冲突。
表名和字段名大小写不敏感,且在创建表、查询表及字段时不支持强制转换大小写。
Schema兼容性
当Hologres源表中的Schema与外表Schema不一致时:
列数不一致:如果Hologres源表中的列数小于外表DDL的列数,则读取RDS数据时,系统会报错。例如
column "xxx" does not exist。当Hologres源表中的列数大于外表DDL的列数时,系统会丢弃超出的列数据。列类型不一致:MaxCompute不支持使用INT类型接收Hologres源表中的STRING类型数据,支持使用STRING类型接收INT类型数据(不推荐)。
语法说明
在创建外部表时,需要在建表DDL语句中指定StorageHandler,并配置STS认证信息(或打开双签名开关)、JDBC连接地址,以实现访问Hologres数据源。
STS模式创建Hologres外部表
具体使用示例代码,详情请参见创建Hologres外部表(STS模式)。
CREATE EXTERNAL TABLE [IF NOT EXISTS] <table_name>(
<col1_name> <data_type>,
<col2_name> <data_type>,
......
)
stored BY 'com.aliyun.odps.jdbc.JdbcStorageHandler'
WITH serdeproperties (
'odps.properties.rolearn'='<ram_arn>')
location '<jdbc:postgresql://<endpoint>:<port>/<database>?ApplicationName=MaxCompute&[currentSchema=<schema>&][useSSL={true|false}&]table=<holo_table_name>/>'
tblproperties (
'mcfed.mapreduce.jdbc.driver.class'='org.postgresql.Driver',
'odps.federation.jdbc.target.db.type'='holo',
'odps.federation.jdbc.colmapping'='<table_column1>:<source_column1>, <table_column2>:<source_column2>,...'
);双签名模式创建Hologres外部表
具体使用示例代码,详情请参见创建Hologres外部表(双签名模式)。
双签名Hologres外部表支持相同RAM用户可以访问MaxCompute和Hologres对应有权限的表,不需要再手工授权。同时支持HologresIP白名单能力,便于使用。
-- 打开双签名开关
SET odps.sql.common.table.planner.ext.hive.bridge=true;
-- 创建外部表
CREATE EXTERNAL TABLE [IF NOT EXISTS] <table_name>(
<col1_name> <data_type>,
<col2_name> <data_type>,
......
)
STORED BY '<com.aliyun.odps.jdbc.JdbcStorageHandler>'
LOCATION '<jdbc:postgresql://<endpoint>:<port>/<database>?ApplicationName=MaxCompute&[currentSchema=<schema>&][useSSL={true|false}&]table=<holo_table_name>/>'
tblproperties (
'mcfed.mapreduce.jdbc.driver.class'='org.postgresql.Driver',
'odps.federation.jdbc.target.db.type'='holo',
['odps.federation.jdbc.colmapping'='<table_column1>:<source_column1>, <table_column2>:<source_column2>,...']
);参数说明
参数 | 是否必填 | 说明 |
odps.sql.common.table.planner.ext.hive.bridge | 是 | 是否通过双签名模式创建Hologres外部表。值设置为 |
否 | 通过STS模式创建Hologres外部表不需要填写。 | |
IF NOT EXISTS | 否 |
|
table_name | 是 | 在MaxCompute上创建的Hologres外部表的名称。 |
col_name | 是 | Hologres外部表的列名称。 |
data_type | 是 | Hologres外部表的列的数据类型。 |
STORED BY | 是 | 指定StorageHandler,定义如何查询Hologres外部表。 固定取值为 |
ram_arn | 是 | 通过STS模式创建Hologres外部表必填。指定RAM角色的ARN信息,用于创建外部表时STS认证信息的填写。
|
否 | 通过双签名模式创建Hologres外部表不需要填写。 | |
LOCATION | 是 | Hologres实例的JDBC连接地址。其中:
|
tblproperties | 是 |
|
使用示例
准备数据
如果已有Hologres数据库、Hologres表及测试数据,可忽略该步骤。
创建Hologres数据库
登录Hologres管理控制台,在左上角选择地域。
在左侧导航栏选择实例列表。
若没有实例,需要先购买Hologres实例。
在实例列表页面,单击目标实例名称。
在实例详情页面,单击登录实例。
单击上方元数据管理页签。
单击新建数据库,在弹出的对话框中,填写数据库名称,其他参数保持默认。
创建Hologres表
在实例详情页面,单击登录实例。
单击上方SQL编辑器页签。
输入如下语句
CREATE TABLE IF NOT EXISTS holo ( id INT PRIMARY KEY, name TEXT ); INSERT INTO holo (id, name) VALUES (1, 'kate'), (2, 'mary'), (3, 'bob'), (4, 'tom'), (5, 'lulu'), (6, 'mark'), (7, 'haward'), (8, 'lilei'), (9, 'hanmeimei'), (10, 'lily'), (11, 'lucy'); SELECT * FROM holo ORDER BY id;
创建Hologres外部表(STS模式)
前置准备
已准备好待创建Hologres外部表的目标MaxCompute项目。
创建MaxCompute项目信息,请参见创建MaxCompute项目。
RAM角色创建及授权
由于Hologres不支持将跨主账号的RAM Role添加至数据库实例,所以Hologres的STS模式普通角色授权只支持同账号的RAM Role。
相应的,MaxCompute访问Hologres的外部表或外部schema,都只支持同账号的RAM Role。
创建RAM角色
创建RAM角色获取ARN信息,用于创建外部表时填写STS认证信息。创建RAM角色的信任主体类型根据实际需求选择,本示例中信任主体类型为云账号。
云账号:阿里云账号下的RAM用户可以通过扮演RAM角色来访问云资源,详情请参见创建可信实体为阿里云账号的RAM角色。
身份提供商:通过设置SSO实现从企业本地账号系统登录至阿里云控制台,解决企业的统一用户登录认证要求。详情请参见创建可信实体为身份提供商的RAM角色。
操作步骤如下:
登录RAM控制台。
在左侧导航栏选择。
在角色页面,单击创建角色。
在创建角色页面,选择信任主体类型为云账号。
信任主体名称选择当前云账号。
修改信任策略配置内容
在角色页面,单击目标角色名称,进入该角色详情页。
在信任策略页签,单击编辑信任策略,在编辑信任策略页面选择脚本编辑页签。
参照如下内容修改信任策略配置
修改信任策略配置内容与选择的可信实体类型相关。其中
<UID>即阿里云账号ID,可在用户信息页面获取。可信实体类型为阿里云账号
{ "Statement": [ { "Action": "sts:AssumeRole", "Effect": "Allow", "Principal": { "RAM": [ "acs:ram::<UID>:root" ] } }, { "Action": "sts:AssumeRole", "Effect": "Allow", "Principal": { "Service": [ "<UID>@odps.aliyuncs.com" ] } } ], "Version": "1" }可信实体类型为身份提供商
{ "Statement": [ { "Action": "sts:AssumeRole", "Condition": { "StringEquals": { "saml:recipient": "https://signin.aliyun.com/saml-role/sso" } }, "Effect": "Allow", "Principal": { "Federated": [ "acs:ram::<UID>:saml-provider/IDP" ] } }, { "Action": "sts:AssumeRole", "Effect": "Allow", "Principal": { "Service": [ "<UID>@odps.aliyuncs.com" ] } } ], "Version": "1" }
添加RAM角色至Hologres实例并授权
RAM角色需要有Hologres实例的开发权限,才能在权限范围内使用Hologres。由于RAM角色默认没有Hologres管理控制台的查看和操作实例的权限,因此需要阿里云账号完成RAM相关权限授予才能进行后续操作。将RAM角色添加至Hologres实例。授权方式及步骤如下:
通过Hologres管理控制台授权
登录Hologres管理控制台,在左上角选择地域。
在左侧导航栏选择实例列表。
在实例列表页面,单击目标实例名称。
在实例详情页面,单击登录实例。
单击上面安全中心页签。
在左侧导航栏选择用户管理。
在用户管理页面,单击右上角新增用户,在弹出的新增用户页面,添加RAM角色至Hologres实例。
在DB授权页签,为该RAM角色授予实例的开发权限。
若数据库的权限策略设置为专家模式,则需在用户管理页面将角色类型修改为SuperUser,后续将不再需要进行数据库授权操作。
在左侧导航栏选择DB 授权。
在DB 授权页面,单击目标数据库对应操作列的用户授权。
在授权页面,单击右上角新增授权,在弹出的新增授权对话框,选择RAM角色并配置Developer 用户组。
通过RAM访问控制台授权
若是通过RAM用户扮演RAM角色,RAM用户默认没有Hologres管理控制台的权限,需要阿里云账号给RAM用户在访问控制页面授予AliyunRAMReadOnlyAccess权限,否则RAM用户无法在Hologres管理控制台进行任何操作。详情请参见文档授予RAM用户权限。
登录RAM控制台。
在左侧导航栏选择。
在角色页面,单击目标角色名称所在行操作列的新增授权。
选择AliyunRAMReadOnlyAccess权限为当前角色授权。
通过SQL方式授权
通过SQL方式进行授权,授权SQL请参见Hologres权限模型。
在MaxCompute中创建外部表
登录MaxCompute客户端,进入目标MaxCompute项目。
执行如下命令创建Hologres外部表。
按照准备数据步骤,准备好的Hologres实例信息如下:
Hologres数据库名称:
holo_external_test。Hologres数据库的Schema:
public。Hologres表名称:
holo。Hologres数据库经典网络连接地址:
hgprecn-cn-oew210ut****-cn-hangzhou-internal.hologres.aliyuncs.com:80。
CREATE EXTERNAL TABLE IF NOT EXISTS my_table_holo_jdbc ( id bigint, name string ) stored BY 'com.aliyun.odps.jdbc.JdbcStorageHandler' WITH serdeproperties ( 'odps.properties.rolearn'='acs:ram::139699392458****:role/<role name>') location 'jdbc:postgresql://hgprecn-cn-oew210ut****-cn-hangzhou-internal.hologres.aliyuncs.com:80/<holo database name>?ApplicationName=MaxCompute¤tSchema=public&useSSL=true&table=<table name>/' tblproperties ( 'mcfed.mapreduce.jdbc.driver.class'='org.postgresql.Driver', 'odps.federation.jdbc.target.db.type'='holo', 'odps.federation.jdbc.colmapping'='id:id,name:name' );执行如下命令基于新建的Hologres外部表查询Hologres源表信息。
-- 访问Hologres外部表需要添加如下属性。 SET odps.sql.split.hive.bridge=true; SET odps.sql.hive.compatible=true; SET odps.table.api.enable.holo.table=true; --开启JDBC直读方式 -- 查询Hologres外部表数据。 SELECT * FROM my_table_holo_jdbc limit 10; -- 返回结果。 +------------+------------+ | id | name | +------------+------------+ | 9 | hanmeimei | | 4 | tom | | 7 | haward | | 2 | mary | | 5 | lulu | | 8 | lilei | | 10 | lily | | 1 | kate | | 6 | mark | | 11 | lucy | +------------+------------+基于Hologres外部表与Hologres进行数据交换、联合分析。
将MaxCompute加工后的数据利用Hologres外部表,写入Hologres实现加速分析、在线服务。命令示例如下。
-- 访问Hologres外部表需要添加如下属性。 SET odps.sql.split.hive.bridge=true; SET odps.sql.hive.compatible=true; SET odps.table.api.enable.holo.table=true; --开启JDBC直读方式 -- 向Hologres外部表插入数据。 INSERT INTO my_table_holo_jdbc VALUES (12,'alice'); -- 查询Hologres外部表数据。 SELECT * FROM my_table_holo_jdbc; -- 返回结果。 +------------+------------+ | id | name | +------------+------------+ | 9 | hanmeimei | | 4 | tom | | 7 | haward | | 2 | mary | | 5 | lulu | | 12 | alice | | 8 | lilei | | 10 | lily | | 1 | kate | | 11 | lucy | | 6 | mark | | 3 | bob | +------------+------------+频繁更新的维度表保存在Hologres,满足实时动态更新需要。MaxCompute通过外部表方式访问维度表与MaxCompute中事实表进行关联分析,命令示例如下。
-- 访问Hologres外部表需要添加如下属性。 SET odps.sql.split.hive.bridge=true; SET odps.sql.hive.compatible=true; -- 创建MaxCompute内部表。 CREATE TABLE holo_test AS SELECT * FROM my_table_holo_jdbc; -- MaxCompute内部表与Hologres外部表进行关联分析。 SELECT * FROM my_table_holo_jdbc t1 INNER JOIN holo_test t2 ON t1.id=t2.id; -- 返回结果。 +------------+------------+------------+------------+ | id | name | id2 | name2 | +------------+------------+------------+------------+ | 9 | hanmeimei | 9 | hanmeimei | | 4 | tom | 4 | tom | | 7 | haward | 7 | haward | | 2 | mary | 2 | mary | | 5 | lulu | 5 | lulu | | 12 | alice | 12 | alice | | 8 | lilei | 8 | lilei | | 10 | lily | 10 | lily | | 1 | kate | 1 | kate | | 11 | lucy | 11 | lucy | | 6 | mark | 6 | mark | | 3 | bob | 3 | bob | +------------+------------+------------+------------+
创建Hologres外部表(双签名模式)
双签名是MaxCompute和Hologres共同研发的认证及鉴权协议,在MaxCompute侧使用账号登录信息加签名后,把认证数据传递给Hologres侧,Hologres根据MaxCompute底层达成的协议,进行同名认证及鉴权。因此,只需在MaxCompute与Hologres中使用相同的账号,便可直接进行外部表访问,无需额外设置认证信息。
前置准备
已准备好待创建Hologres外部表的目标MaxCompute项目。
创建MaxCompute项目信息,请参见创建MaxCompute项目。
Hologres中存在跟MaxCompute相同名称的账号,并且该账号具有Hologres中对应表的读写权限。
仅Hologres V1.3及以上版本支持MaxCompute使用双签名模式创建Hologres外部表,目前双签名模式只支持从Hologres外部表中读取数据,不支持写入数据至Hologres外部表。
在MaxCompute中创建外部表
登录MaxCompute客户端,进入目标MaxCompute项目。
执行如下命令创建Hologres外部表。
按照准备数据步骤,准备好的Hologres实例信息如下:
Hologres数据库名称:
holo_external_test。Hologres数据库的Schema:
public。Hologres表名称:
holo。Hologres数据库经典网络连接地址:
hgprecn-cn-oew210ut****-cn-hangzhou-internal.hologres.aliyuncs.com:80。
-- 创建外部表 CREATE EXTERNAL TABLE IF NOT EXISTS holo_mc_external_dbl ( id int, name string ) STORED BY 'com.aliyun.odps.jdbc.JdbcStorageHandler' location 'jdbc:postgresql://hgpostcn-cn-****-cn-hangzhou-internal.hologres.aliyuncs.com:80/<holo database name>?ApplicationName=MaxCompute¤tSchema=public&preferQueryMode=simple&useSSL=false&table=<table name>/' TBLPROPERTIES ( 'mcfed.mapreduce.jdbc.driver.class'='org.postgresql.Driver', 'odps.federation.jdbc.target.db.type'='holo', 'odps.federation.jdbc.colmapping'='id:id,name:name' );查询外部表
-- 查询外部表(必须与打开双签名开关命令一起执行) SET odps.sql.common.table.planner.ext.hive.bridge=true; SELECT * FROM holo_mc_external_dbl; -- 返回结果。 +------------+------------+ | id | name | +------------+------------+ | 9 | hanmeimei | | 4 | tom | | 7 | haward | | 2 | mary | | 5 | lulu | | 12 | alice | | 8 | lilei | | 10 | lily | | 1 | kate | | 11 | lucy | | 6 | mark | | 3 | bob | +------------+------------+
开启Hologres外部表存储直读功能
MaxCompute对Hologres外部表的读通过JDBC模式实现,目前版本支持MaxCompute直读Hologres存储层,能够带来以下优势:
可以大幅降低读表的延迟,显著提高查询数据的速度。
可以大幅度减少Hologres FE的连接数,大多数Query仅需要一个连接数。
使用限制
当开启Hologres直读模式时,使用限制如下,在条件不满足时会回退到JDBC模式。
版本要求
Hologres实例版本必须为V1.3.34及以上。低于V1.3.34的版本不支持直读功能。
表类型限制
不支持直读Hologres冷存表。
不支持直读Hologres行存表。
数据类型映射限制
MaxCompute直读模式使用Timestamp类型映射Hologres中的Timestamp With Time Zone类型会存在细微的时间误差,具体差异如下:
时间值误差
Hologres中Timestamp With Time Zone类型列的时间在
1900-12-31 15:54:15之前,MaxCompute查询出来的时间会多5分44秒。Hologres中Timestamp With Time Zone类型列的时间在
1900-12-31 15:54:16和1969-12-31 23:59:58之间,MaxCompute查询出来的时间会多1秒。Hologres中Timestamp With Time Zone类型列的时间在
1969-12-31 23:59:59之后,MaxCompute查询出来的时间与Hologres中的无区别。
时区偏移
以MaxCompute的时区为东八区为例,Hologres中Timestamp With Time Zone类型列的时间为
2000-01-01 00:00:00,MaxCompute查询出来的时间为2000-01-01 08:00:00。以MaxCompute的时区为东八区为例,Hologres中Timestamp With Time Zone类型列的时间为
1969-01-01 00:00:00,MaxCompute查询出来的时间为1969-01-01 08:00:01。
同Region限制
由于网络连通性限制,只支持同Region的MaxCompute访问Hologres实例。跨Region访问会报错:
FAILED: ODPS-0010000:System internal error - fuxi job failed, caused by: Pangu request failed with error code 3。当Hologres配置为主从架构,仅支持配置连接URL为主实例,不支持配置为从实例。
Foreign Server模式存在的额外限制:MaxCompute项目需要开启Schema级语法开关。
开启方式
在MaxCompute中查询Hologres外部表时SQL前加上如下参数。
SET odps.table.api.enable.holo.table=true;设置项目粒度直读开关。
-- 打开直读开关 和直读时关闭回退成jdbc 都可以设置为项目粒度。
-- 项目粒度打开直读开关:
setproject odps.table.api.enable.holo.table=true; --true开启|false关闭
-- 关闭默认回退JDBC的开关:
setproject odps.table.api.allow.fallback.jdbc=false; --true回退|false不回退直读验证
可以在Logview里查看日志,判断查询是否走了直读模式,Logview使用详情请参见使用Logview 2.0查看作业运行信息。
在Logview的Summary页签下,查找external holo tables字段查看属性,属性格式如下:
<project_name>.<table_name>:<访问方式>[<(回退原因)>]参数说明:
参数 | 说明 |
project_name | 项目名称。 |
table_name | 表名称。 |
访问方式 | 外部表的访问方式,取值如下:
|
回退原因 | 如果访问方式为
|
开启了直读模式运行的任务,偶然触发直读限制场景,任务会回退成JDBC模式。如果直读时业务负载比较大,回退成JDCBC模式会占用大量的Hologres连接池资源,且JDBC方式数据传输效率远低于直读,占用资源释放也会比较慢。
需要关注直读回退成JDBC方式后,会对Hologres实例造成负载压力,极端情况下会因为大量回退的作业影响其他业务访问Hologres实例。为了预防这种情况,可以提前通过在直读任务中增加运行参数set odps.table.api.allow.fallback.jdbc=false;关闭自动回退,避免非预期影响。
Hologres数据导入导出
常见问题
通过MaxCompute直读Hologres数据时,报错ODPS-0130071,如何解决?
问题现象
直读Hologres数据时,报错
ODPS-0130071 Failed to split to equal size...max count: 7777。例如:ODPS-0130071:[0,0] Semantic analysis exception - physical plan generation failed: storage/table/src/input_splits_builder.cpp(195): StorageException: Failed to split to equal size, total size: 2143570729934, min size: 268435456, max size: 272629760, max count: 7777, split size: 275629513, split count: 7777产生原因
MaxCompute直读Hologres中的数据时,按照默认的拆分Mapper策略(输入数据量/split.size 256MB),导致任务产生的Mapper并发数超过了最大限制数7777。
说明该限制是防止用户直接提交生成大量Mapper任务,从而对Hologres文件或网络连接的稳定性产生影响。
解决措施
您可以通过设置以下参数,解决报错问题。
SET odps.external.holo.mapper.instances=10000; -- 提高并发上限,最高不超过10000。 SET odps.sql.mapper.split.size=512; -- 调整任务并发数,最高不超过512M
基于Hologres外部表执行SQL作业时,运行慢,如何解决?
使用SDK搜索MaxCompute外部表数据速度慢。
问题现象
使用SDK搜索MaxCompute外部表数据速度慢。
解决措施
外部表仅支持全量搜索,所以较慢,建议您改用MaxCompute内部表。
当Hologres侧使用关键字作为列名时报错,如何解决?
问题现象
当Hologres侧使用关键字作为列名,如果不加特殊配置,会出现如下报错:
ODPS-0123131:User defined function exception - SQLException in nextKeyValueCaused by: org.postgresql.util.PSQLException: ERROR: syntax error at or near ","解决措施
添加参数映射Hologres源表和Hologres外部表字段关系:
odps.federation.jdbc.colmapping。例如:Hologres源表包含关键字字段
"offset",则创建Hologres外部表时需要添加参数为'odps.federation.jdbc.colmapping'='offset:"offset"'。
相关文档
Hologres外部表常见问题详情,请参见外部表常见问题。

