Data Lake Analytics 做为云上数据处理的枢纽,最近加入了对于RDS(目前支持 MySQL
, SQLServer
,Postgres
引擎)的支持, 这篇教程带你玩转 DLA 的 RDS 支持。咱们文章中会以 MySQL
的介绍为主,最后会简要介绍下 SQLServer
与 Postgres
的一些不一样点、须要注意的地方。mysql
在 DLA 里面建立一个底层映射到 MySQL
的外表的语法以下:sql
CREATE SCHEMA hello_mysql_vpc_rds WITH DBPROPERTIES ( CATALOG = 'mysql', LOCATION = 'jdbc:mysql://rm-2zer0vg58mfofake.mysql.rds.aliyuncs.com:3306/dla_test', USER = 'dla_test', PASSWORD = 'the-fake-password', VPC_ID = 'vpc-2zeij924vxd303kwifake', INSTANCE_ID = 'rm-2zer0vg58mfo5fake' );
跟普通的建表不一样的是这里多了两个属性: VPC_ID
和 INSTANCE_ID
。VPC_ID
是你的RDS所在VPC的ID, 以下图所示:数据库
而 INSTANCE_ID
则是你的RDS实例ID, 在RDS的详情页面能够找到:app
建表须要这两个额外信息是由于如今用户的数据库都是处于用户本身的VPC内部,默认状况下 DLA 是访问不了用户 VPC 里面的资源的,为了让DLA可以访问到用户RDS里面的数据,咱们须要利用阿里云的VPC反向访问技术。sqlserver
权限声明: 当您经过上述方式建库,就视为您赞成咱们利用VPC反向访问的技术去读写您的RDS。post
另外您还须要把 100.104.0.0/16
IP地址段加入到你的RDS的白名单列表,这是咱们VPC反向访问的IP地段,以下图:测试
数据库建完以后,咱们能够建表了,咱们先在你的 RDS 里面创建以下的 person 表用来作测试:大数据
create table person ( id int, name varchar(1023), age int );
而且向里面插入一下测试数据:this
insert into person values (1, 'james', 10), (2, 'bond', 20), (3, 'jack', 30), (4, 'lucy', 40);
而后就能够在 DLA 的数据库里面创建相应的映射表了:阿里云
create external table person ( id int, name varchar(1023), age int ) tblproperties ( table_mapping = "person" );
这样咱们经过MySQL客户端链接到 DLA 数据库上面,就能够对 MySQL 数据库里面的数据进行查询了:
mysql> select * from person; +------+-------+------+ | id | name | age | +------+-------+------+ | 1 | james | 10 | | 2 | bond | 20 | | 3 | jack | 30 | | 4 | lucy | 40 | +------+-------+------+ 4 rows in set (0.35 sec)
其实 DLA 里面使用 RDS 的典型场景不是把RDS的数据读出来进行分析,由于RDS自己能承载的数据量有限,不适合大数据分析,更多的场景是在咱们对存储在OSS/OTS上的大数据进行分析,分析完成以后把结果数据回写到 RDS 里面供前台业务使用。这种场景在DLA里面很是容易实现,仍是举前面 person
表例子,下面的语句把 oss_db
里面 customer
的十条记录进行了一些转换而后插入了咱们的 hello_mysql_vps_rds.person
表:
mysql> insert into hello_mysql_vpc_rds.person -> select c_custkey, c_name, c_custkey + 20 from oss_db.customer limit 10; +------+ | rows | +------+ | 10 | +------+ 1 row in set (4.57 sec) mysql> select * from person; +------+--------------------+------+ | id | name | age | +------+--------------------+------+ | 1 | james | 10 | | 2 | bond | 20 | | 3 | jack | 30 | | 4 | lucy | 40 | | 1 | Customer#000000001 | 21 | | 3 | Customer#000000003 | 23 | | 5 | Customer#000000005 | 25 | | 2 | Customer#000000002 | 22 | | 4 | Customer#000000004 | 24 | | 7 | Customer#000000007 | 27 | | 6 | Customer#000000006 | 26 | | 9 | Customer#000000009 | 29 | | 8 | Customer#000000008 | 28 | | 10 | Customer#000000010 | 30 | +------+--------------------+------+ 14 rows in set (0.26 sec)
SQLServer
和 PostgreSQL
整体用法上跟 MySQL 相似,可是由于 MySQL
里面 database
跟 schema
是等价的,只有一层结构,而 SQLServer
和 PostgreSQL
面则有 database
和 schema
的两层结构,所以在建库和建表的时候都有点稍微不同:
SQLServer
CREATE SCHEMA `hello_sqlserver_vpc_rds` WITH DBPROPERTIES ( CATALOG = 'sqlserver', LOCATION = 'jdbc:sqlserver://rm-bp15g1r5jf90hfake.sqlserver.rds.aliyuncs.com:3433;DatabaseName=dla_test', USER='dla_test1', PASSWORD='this-is-not-a-real-password', INSTANCE_ID = 'rm-bp15g1r5jf90fake', VPC_ID = 'vpc-bp1adypqlcn535yrdfake' );
CATALOG
要指定 sqlserver
。LOCATION
要指定数据库的名字,指定的方式跟 MySQL
不同, 是经过 DatabaseName=dla_test
的方式来指定。这是 SQLServer JDBC URL 定义的,不是DLA定义的。PostgreSQL
CREATE SCHEMA `hello_postgresql_vpc_rds` WITH DBPROPERTIES ( CATALOG = 'postgresql', LOCATION = 'jdbc:postgresql://rm-bp1oo49r6j3hvfake.pg.rds.aliyuncs.com:3433/dla_test', USER='dla_test', PASSWORD='this-is-not-a-real-password', INSTANCE_ID = 'rm-bp1oo49r6j3hfake', VPC_ID = 'vpc-bp1adypqlcn535yrfake' );
这里跟 MySQL
几乎同样,除了 CATALOG
要指定成 postgresql
。
建表这块的差别主要在 table_mapping
这个字段里面, MySQL
的 table_mapping
里面只有表名(person
):
create external table person1 ( id int, name varchar(1023), age int ) tblproperties( table_mapping = 'person' );
而 SQLServer
和 PostgreSQL
的 table_mapping
里面则要有schema的名字和表名:
create external table person ( id int, name varchar(1023), age int ) tblproperties( table_mapping = 'public.person' );
Happy DLAing!
本文做者:xumingmingv
本文为云栖社区原创内容,未经容许不得转载。