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

阅读原文

本文为云栖社区原创内容,未经容许不得转载。

相关文章
相关标签/搜索