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
的兩層結構,所以在建庫和建表的時候都有點稍微不同:
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定義的。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!
原文連接 本文爲雲棲社區原創內容,未經容許不得轉載。