Data Lake Analytics: 以SQL方式查詢Redis數據

clipboard.png

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服務的域名和端口你能夠從阿里雲控制直接查詢到:數據庫

clipboard.png

跟普通的建庫語法不一樣的是這裏多了兩個屬性: VPC_ID 和 INSTANCE_ID , 這是由於如今用戶的 Redis 數據庫都是處於用戶本身的VPC內部,默認狀況下 DLA 是訪問不了用戶 VPC 裏面的資源的,爲了讓DLA可以訪問到用戶RDS裏面的數據,咱們須要利用阿里雲的VPC反向訪問技術。json

權限聲明: 當您經過上述方式建庫,就視爲您贊成咱們利用VPC反向訪問的技術去讀寫您的 Redis 。數組

另外您還須要把 100.104.0.0/16 加入你的 Redis 的白名單列表,這是咱們VPC反向訪問的IP地段,以下圖:服務器

clipboard.png

建立表
數據庫建完以後,咱們能夠建表了,咱們先在你的 Redis 裏初始化一些數據用來測試, 由於Redis是沒有schema信息的,咱們必須往裏面插入數據才能生效,因此咱們插入一些測試數據:app

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、流轉

本文做者:xumingmingv

閱讀原文

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

相關文章
相關標籤/搜索