Data Lake Analytics 做爲雲上數據處理的樞紐,最近加入了對於Redis 的支持, 這篇教程帶你玩轉 DLA 的 Redis 支持。mysql
建立數據庫
在 DLA 裏面建立一個底層映射到 Redis 的數據庫的語法以下:redis
CREATE DATABASE redis_test
WITH DBPROPERTIES (sql
catalog = 'redis', location = 'r-xxxxx.redis.rds.aliyuncs.com:6379/hello_', password = 'xxxxx', vpc_id = 'vpc-xxxxx', instance_id = 'r-xxxxxx'
)
這裏要特別說明一下這個 location 屬性,前面 r-xxxxx.redis.rds.aliyuncs.com:6379 是redis服務器的域名和端口,最後的 hello_ 是一個前綴,具體的用途後面再細說,redis服務的域名和端口你能夠從阿里雲控制直接查詢到:數據庫
跟普通的建庫語法不一樣的是這裏多了兩個屬性: VPC_ID 和 INSTANCE_ID , 這是由於如今用戶的 Redis 數據庫都是處於用戶本身的VPC內部,默認狀況下 DLA 是訪問不了用戶 VPC 裏面的資源的,爲了讓DLA可以訪問到用戶RDS裏面的數據,咱們須要利用阿里雲的VPC反向訪問技術。json
權限聲明: 當您經過上述方式建庫,就視爲您贊成咱們利用VPC反向訪問的技術去讀寫您的 Redis 。數組
另外您還須要把 100.104.0.0/16 加入你的 Redis 的白名單列表,這是咱們VPC反向訪問的IP地段,以下圖:服務器
建立表
數據庫建完以後,咱們能夠建表了,咱們先在你的 Redis 裏初始化一些數據用來測試, 由於Redis是沒有schema信息的,咱們必須往裏面插入數據才能生效,因此咱們插入一些測試數據:app
set hello_world_1 1,james,10
set hello_world_2 2,bond,20
set hello_world_3 3,lily,30
set hello_world_4 4,lucy,20測試
set hello_foo_1 '{"id":1,"name":"james","age":110}'
set hello_foo_2 '{"id": 2, "name": "bond", "age": 210}'
set hello_foo_3 '{"id": 3, "name": "lily", "age": 310}'
set hello_foo_4 '{"id": 3, "name": "lucy", "age": 210}'
咱們插入了兩種格式的數據,一種是CSV格式的,一種是JSON格式的,這是咱們目前支持的兩種格式,後面會分別演示。阿里雲
而後就能夠在 DLA 的數據庫裏面創建相應的映射表了:
CREATE EXTERNAL TABLE dla_person (
id int, name varchar, age int
) TBLPROPERTIES (
COLUMN_MAPPING = 'id,2;name,1;age,0', TABLE_MAPPING = 'world_', format = 'csv'
);
這裏幾個字段詳細說明一下:
TABLE_MAPPING 讓咱們可讓DLA層面的表名映射到底層Redis裏面指定模式的的一組key。回憶一下咱們前面在建庫的時候指過前綴 hello_ , 再與這裏的 world_ 相結合,表達的意思就是:
表 dla_person 裏面的數據映射到Redis數據庫裏面全部key的前綴爲 hello_world_ 的數據。
這裏,你也能夠省略這個設置,默認的前綴跟表名一致,在上面的例子裏面省略 TABLE_MAPPING, 那麼最終查詢的key的前綴爲 hello_dla_person。
下一個咱們關注一下參數 format, 這裏指定Redis裏面數據的格式,目前支持: csv, json 兩種格式。
COLUMN_MAPPING 的做用是把DLA層面的列映射到底層的數據上,因爲Redis底層沒有column的概念,所以具體映射的方法根據 format 的不一樣而不一樣, 好比這裏的 CSV, 咱們知道CSV的數據被解析以後會造成一個string數組,對應的column_mapping就映射到底層這個數組的index(下標)。好比這裏把 id 映射到下標 2, 把 name 映射到下標 1 等等。
column_mapping 也能夠不設置,對於CSV格式來講會按照column聲明的順序依次映射到0, 1, 2等等。
這樣咱們就能夠經過MySQL客戶端鏈接到 DLA 數據庫上面,就能夠對 Redis 數據庫裏面的數據進行查詢了:
mysql> select * from dla_person; | ||
---|---|---|
name | id | age |
bond | 20 | 2 |
lily | 30 | 3 |
lucy | 20 | 4 |
james | 10 | 1 |
4 rows in set (0.18 sec)
熟悉SQL的同窗必定以爲很爽吧,能夠去熟悉的SQL語法去操做 Redis 數據庫了。
JSON
上面演示的是CSV格式的數據,下面咱們再來試試JSON格式的數據,咱們再來建立一個新表:
CREATE EXTERNAL TABLE dla_person_json (
id int, name varchar, age int
) TBLPROPERTIES (
COLUMN_MAPPING = 'id,age;name,name;age,id', TABLE_MAPPING = 'foo_', format = 'json'
);
注意這裏咱們指定了 TABLE_MAPPING 爲 foo_,結合數據庫的前綴 hello_, 所以它最終查詢的是Redis裏面全部前綴爲 hello_foo_ 的數據; 另外這裏還指定了 COLUMN_MAPPING, 由於JSON數據裏面是有字段名字的,所以DLA的層面的column的名字是映射到JSON數據裏面字段的名字的,這裏爲了演示的須要故意把DLA的 id column映射到了 Redis的 age, 咱們來查詢看看結果:
mysql> select * from dla_person_json; | ||
---|---|---|
name | id | age |
lucy | 210 | 3 |
james | 110 | 1 |
bond | 210 | 2 |
lily | 310 | 3 |
4 rows in set (0.12 sec)
如咱們所願,id column顯示的是Redis裏面對應的 age 字段的值。
總結
咱們今天介紹了DLA對於Redis的支持,目前DLA支持的數據源已經包括: OSS, OTS, RDS(MySQL, SQLServer, Postgres), MongoDB, Redis等等 數據能夠在這些數據源之間進行聯合JOIN、流轉
本文做者:xumingmingv
本文爲雲棲社區原創內容,未經容許不得轉載。