作為雲上資料處理的樞紐,最近加入了對于
Redis的支援, 這篇教程帶你玩轉 DLA 的 Redis 支援。
建立資料庫
在 DLA 裡面建立一個底層映射到
Redis
的資料庫的文法如下:
CREATE DATABASE `redis_test`
WITH DBPROPERTIES (
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反向通路技術。
權限聲明: 當您通過上述方式建庫,就視為您同意我們利用VPC反向通路的技術去讀寫您的 Redis 。
另外您還需要把
100.104.0.0/16
加入你的 Redis 的白名單清單,這是我們VPC反向通路的IP地段,如下圖:
建立表
資料庫建完之後,我們可以建表了,我們先在你的 Redis 裡初始化一些資料用來測試, 因為Redis是沒有schema資訊的,我們必須往裡面插入資料才能生效,是以我們插入一些測試資料:
# CSV格式的資料
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
# JSON格式的資料
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_
相結合,表達的意思就是:
表裡面的資料映射到Redis資料庫裡面所有key的字首為
dla_person
的資料。
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、流轉,更多詳細的介紹可以直接去
我們的官網試用。
Happy DLAing!