乐趣区

Data Lake Analytics: 以SQL方式查询Redis数据

Data Lake Analytics 作为云上数据处理的枢纽,最近加入了对于 Redis 的支持, 这篇教程带你玩转 DLA 的 Redis 支持。
创建数据库在 DLA 里面创建一个底层映射到 Redis 的数据库的语法如下:
CREATE DATABASE redis_testWITH 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,10set hello_world_2 2,bond,20set hello_world_3 3,lily,30set 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
阅读原文
本文为云栖社区原创内容,未经允许不得转载。

退出移动版