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 MySQL 5.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;