天天看點

Data Lake Analytics: 以SQL方式查詢Redis資料

Data Lake Analytics: 以SQL方式查詢Redis資料
Data Lake Analytics

作為雲上資料處理的樞紐,最近加入了對于

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服務的域名和端口你可以從阿裡雲控制直接查詢到:

Data Lake Analytics: 以SQL方式查詢Redis資料

跟普通的建庫文法不同的是這裡多了兩個屬性:

VPC_ID

INSTANCE_ID

, 這是因為現在使用者的 Redis 資料庫都是處于使用者自己的VPC内部,預設情況下 DLA 是通路不了使用者 VPC 裡面的資源的,為了讓DLA能夠通路到使用者RDS裡面的資料,我們需要利用阿裡雲的VPC反向通路技術。

權限聲明: 當您通過上述方式建庫,就視為您同意我們利用VPC反向通路的技術去讀寫您的 Redis 。

另外您還需要把

100.104.0.0/16

加入你的 Redis 的白名單清單,這是我們VPC反向通路的IP地段,如下圖:

Data Lake Analytics: 以SQL方式查詢Redis資料

建立表

資料庫建完之後,我們可以建表了,我們先在你的 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_

相結合,表達的意思就是:

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、流轉,更多詳細的介紹可以直接去

我們的官網

試用。

Happy DLAing!