使用Data Lake Analytics讀/寫RDS數據

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)

ETL: 把數據從OSS裏面清洗出來寫入RDS

其實 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

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!


原文連接 本文爲雲棲社區原創內容,未經容許不得轉載。

相關文章
相關標籤/搜索