RDS(Relational Database Service)是阿里云用户主要使用的服务,需要通过内网域名访问。如果您需要通过MaxCompute将数据加载至RDS的表中,可参考该文档进行操作。本文为您介绍如何在外网或VPC网络环境下基于RDS数据源创建外部表并写入数据。
前提条件
已开通MaxCompute和云数据库RDS间的网络连接,详情请参见网络开通流程。
使用限制
支持华北2(北京)、华东2(上海)、华北3(张家口)、华北6(乌兰察布)、华东1(杭州)、华南1(深圳)、中国香港、华东 2 金融云(可用区F)、日本(东京)、新加坡、马来西亚(吉隆坡)、印度尼西亚(雅加达)、德国(法兰克福)、美国(硅谷)、美国(弗吉尼亚)地域通过访问VPC方案(专线直连)连接MaxCompute和云数据库RDS,仅以上地域可以创建RDS数据源外部表,其他地域暂不支持。
网络打通时,MaxCompute侧仅打通到所填VPC ID的网络连接,如需跨Region访问或者访问该Region的其他VPC,请根据云上VPC现有打通方案,打通专线直连方案所填写的VPC和其他VPC之间的网络。
暂不支持PrivateZone域名。
支持RDS MySQL5.x版本,暂不支持8.0版本及其他RDS引擎。
当您需要向RDS外部表写入大量数据时,采用并行多进程写入方式,会小概率出现某个写入进程数据重写情况,导致数据重复。
MaxCompute里建的RDS外部表,其中DECIMAL数据类型默认小数18位,不能修改,只能建成
decimal(38,18)
。如果小数位数比较少,可以在MaxCompute中建外部表时数据类型选择String,使用的时候再使用cast
函数强制转换。RDS外部表不支持cluster属性。
语法说明
建表时,表名和列名大小写不敏感。在查询表或列名时,无需区分大小写,且不支持强制转换大小写。
--开启Hive兼容模式。
SET odps.sql.hive.compatible = true;
CREATE EXTERNAL TABLE <mcrdsexternal_table_name>(
<col_name1> <data_type>,
<col_name2> <data_type>,
......
)
STORED BY 'com.aliyun.odps.jdbc.JdbcStorageHandler' --处理JDBC连接类数据源的Handler。
location '<jdbc:mysql://realm_name:port/rds_database_name?useSSL=false&user=user_name&password=password_value&table=rds_table_name>'
TBLPROPERTIES(
['odps.federation.jdbc.colmapping'='<col_name1:rdstable_colname1|select_alias1>[,<col_name2:rdstable_colname2|select_alias2>,...]',]
'mcfed.mapreduce.jdbc.input.query'='<select_sentence>',
'networklink'='<networklink_name>'
)
;
mcrdsexternal_table_name:必填。待创建外部表的名称。
col_name:必填。外部表的列名称。
data_type:必填。列的数据类型。
jdbc:mysql://realm_name:port/rds_database_name?useSSL=false&user=user_name&password=password_value&table=rds_table_name:必填。连接RDS数据源表的连接字符串。
说明连接字符串中如果包含特殊字符需要转换为URL编码,转换URL编码请参见URL_ENCODE。
realm_name:port:RDS数据连接内网地址及内网端口,获取方式请参见查看和管理实例连接地址和端口。
rds_database_name:RDS数据库名称。
user_name:RDS数据库的账号。
password_value:RDS数据库的密码。
rds_table_name:RDS源表名称。
TBLPROPERTIES:
odps.federation.jdbc.colmapping:可选。MaxCompute外部表与RDS数据源表列的映射关系,此处的映射列数需要与MaxCompute外部表定义的列数保持一致。其中:rdstable_colname为RDS源表的列名(全部列映射),select_alias为给查询结果定义的列别名(指定列映射)。
若未配置该参数,则会使用MaxCompute外部表中定义的列名映射RDS同名列访问。
若配置该参数,但是只指定MaxCompute外部表部分列的映射关系,则按照源表字段名映射至RDS外部表的对应列。其他未指定的列,如果列名或类型不匹配会报错。
mcfed.mapreduce.jdbc.input.query:可选。读取RDS数据源表数据。外部表的列、列名与直接查询的RDS数据源表的列、列名及数据类型保持一致。如果使用了别名,则与别名保持一致。
select_sentence
格式为SELECT xxx FROM <rds_database_name>.<rds_table_name>
。networklink:必填。RDS实例所在VPC的MaxCompute网络连接名称。您可以请登录MaxCompute控制台,在左侧导航栏选择 ,即可在网络连接页面获取您所创建对应的网络连接名称。
使用RDS数据源创建MaxCompute的外部表并加载数据
使用RDS数据源创建MaxCompute外部表的步骤如下:
登录RDS数据库,执行建表语句并插入数据。操作详情请参见通过DMS登录RDS数据库。
建表示例如下:
CREATE TABLE `rds_mc_external` ( `id` int(11) DEFAULT NULL, `name` varchar(32) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8; INSERT INTO `rds_mc_external`(`id` ,`name` ) VALUES(1,"lisi"); INSERT INTO `rds_mc_external`(`id` ,`name` ) VALUES(1,"zhangsan");
在MaxCompute客户端创建映射RDS数据源的外部表。您可以通过如下两种方式进行操作:
创建MaxCompute外部表的列名和RDS中表的列名完全对应。
在MaxCompute客户端创建外部表,表列名与RDS中表的列名完全对应。命令示例如下:
SET odps.sql.hive.compatible = true; CREATE EXTERNAL TABLE mc_vpc_rds_external ( id int, name string ) STORED BY 'com.aliyun.odps.jdbc.JdbcStorageHandler' location 'jdbc:mysql://rm-2ze01y92y1tzp****.mysql.rds.aliyuncs.com:3306/rds_test?useSSL=false&user=****&password=****&table=rds_mc_external' TBLPROPERTIES( 'mcfed.mapreduce.jdbc.input.query'='select * from rds_test.rds_mc_external', 'networklink'='networklink4mysql' );
向新建的MaxCompute表中插入数据。
命令示例如下:
--插入数据。 INSERT INTO table mc_vpc_rds_external VALUES(2,"zhagnsan");
查询数据插入结果。
命令示例如下:
--查询数据插入结果。 SELECT * FROM mc_vpc_rds_external;
创建MaxCompute外部表的列名和RDS表指定的列名进行映射。
在MaxCompute客户端创建外部表,表列名与RDS表中指定的列名进行映射。命令示例如下:
SET odps.sql.hive.compatible = true; CREATE EXTERNAL TABLE mc_vpc_rds_external_mapping ( key int, value string ) STORED BY 'com.aliyun.odps.jdbc.JdbcStorageHandler' location 'jdbc:mysql://rm-2ze01y92y1tzp****.mysql.rds.aliyuncs.com:3306/rds_test?useSSL=false&user=****&password=****&table=rds_mc_external' TBLPROPERTIES( 'mcfed.mapreduce.jdbc.input.query'='select * from rds_test.rds_mc_external', 'networklink'='networklink4mysql' );
向新建的MaxCompute表中插入数据。
命令示例如下:
--插入数据。 INSERT INTO TABLE mc_vpc_rds_external_mapping VALUES(4,"lisi");
查询数据插入结果。
命令示例如下:
--查询数据插入结果。 SELECT * FROM mc_vpc_rds_external_mapping;