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服務的域名和端口你可以從阿里云控制直接查詢到:
跟普通的建庫語法不同的是這里多了兩個屬性:?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_?相結合,表達的意思就是:
表?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、流轉。
?
原文鏈接
本文為云棲社區原創內容,未經允許不得轉載。
總結
以上是生活随笔為你收集整理的Data Lake Analytics: 以SQL方式查询Redis数据的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 全民学后端快餐教程(1) - 只不过是写
- 下一篇: Apache Cassandra 在 F