RDS外部表

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外部表的步骤如下:

  1. 登录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");
  2. 在MaxCompute客户端创建映射RDS数据源的外部表。您可以通过如下两种方式进行操作:

    • 创建MaxCompute外部表的列名和RDS中表的列名完全对应。

      1. 在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'
        );
      2. 向新建的MaxCompute表中插入数据。

        命令示例如下:

        --插入数据。
        INSERT INTO table mc_vpc_rds_external VALUES(2,"zhagnsan");
      3. 查询数据插入结果。

        命令示例如下:

        --查询数据插入结果。
        SELECT * FROM mc_vpc_rds_external;
    • 创建MaxCompute外部表的列名和RDS表指定的列名进行映射。

      1. 在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'
        );
      2. 向新建的MaxCompute表中插入数据。

        命令示例如下:

        --插入数据。
        INSERT INTO TABLE mc_vpc_rds_external_mapping VALUES(4,"lisi");
      3. 查询数据插入结果。

        命令示例如下:

        --查询数据插入结果。
        SELECT * FROM mc_vpc_rds_external_mapping;