YDB视图表
全库资源汇聚搜索高效解决方案
业务有成百上千张表,每张表有上百个列。
想要根据关键字搜索含有该关键字的记录怎么办? 每张表都写一个sql么?每个列都要拼到where条件里去搜索么?no 其实对于资源汇聚类型的搜索可以一条sql就搞定,又兼容原先的表结构,业务其他部分依然可以单表查询。
是不是有这样一种场景,每张表的数据量都不多 ,但是你的表特别多,几十张甚至几百张表。 如果每个表都创建一个物理表,那么是比较浪费资源的
- 每张表都要维护自己的BUFFER,弄不好就OOM,导入性能实在太差.
- 都要单独开个线程去维护这张表.
- 生成的索引都很小,但是文件数量太多,频繁合并索引导致namenode非常繁忙等等
如今YDB的视图表可以帮你解决这个问题。 视图表示建立在物理表的基础上的。一张物理表上面可以放很多视图表,这些表统一管理,统一心跳,统一一个索引,对外部用户来说对视图表的查询和对物理表的查询,在使用上没有什么区别。 有了视图表以后,原先需要为那些小业务分别创建表,单独搭建集群的问题也可以得到解决。 规模不大的业务,可以共享同一个集群,共享同一个物理表,业务和业务之间是图表隔离。
视图表并不真实存储数据,如下图所示,视图表通过映射将数据存储在其对应的物理表中.
创建视图表
create ydbview ydbview_007(
phonenum dblikebig [email protected],
usernick string [email protected],
ydb_sex string [email protected],
ydb_province string [email protected],
ydb_grade string [email protected],
ydb_age string [email protected],
ydb_blood string [email protected],
ydb_zhiye string [email protected],
ydb_earn string [email protected],
ydb_prefer string [email protected],
ydb_consume string [email protected],
ydb_day string [email protected],
amtdouble tdouble [email protected],
czylong tlong [email protected]_y_tlong_id [email protected],
content dblikebig [email protected]
)
;
1.如果不做配置,默认视图表对应的物理表名称为ydb_physical_table,所有的列均进行汇聚
2.在视图表中字段有三种展现方式 combineonly,fieldonly,all
1)指定combineonly的字段将数据储存在聚合列ydbview_like字段中,在视图表中不可见,物理表中可见
2)指定fieldonly的字段在视图表中可查,在物理表中不可查,不存储在ydbview_like中
3)指定all的字段数据在视图表和物理表中均可查,并存储在 ydbview_like 中一份
4)创建表时可以通过
amtlong tlong [email protected]_y_tlong_id,
这种方式来指定视图表与物理表中字段的对应关系
5)如下图所示①部分指定视图表对应的物理表名称,通过修改physical_example 部分修改对应的物理表名。②部分是指定在不指定存储策略的情况下,默认的存储策略是 ‘all’策略,可修改。①②部分都是可选配置,可不添加,不添加则为默认参数 物理表名为ydb_physical_table 存储策略为all
使用ydb提供的工具伪造一些数据
cd /opt/ydbsoftware/ya100
hadoop fs -rm -r /data/example/quickstart/
hadoop fs -mkdir -p /data/example/quickstart/
hadoop jar ./lib/ydb-1.1.9-pg.jar cn.net.ycloud.ydb.server.reader.kafka.MrMakeShuData 30000000 /data/example/quickstart/1.txt
将数据导入到视图表中
cd /opt/ydbsoftware/ya100
sh ./bin/ydbimport.sh -ov -t ydbview_007 -p 3000w -tp txt -f /data/example/quickstart -sp , -fl phonenum,usernick,ydb_sex,ydb_province,ydb_grade,ydb_age,ydb_blood,ydb_zhiye,ydb_earn,ydb_prefer,ydb_consume,ydb_day,amtdouble,amtlong,content
接下来我们验证一下设置的参数是否生效
视图表数据预览
select * from ydbview_007 where ydbpartition=‘3000w‘ limit 10
结果
在这里我们可以看到在视图表中phonenum usernick ydb_sex ydb_province ydb_grade ydb_age,czylong中在视图表中是不可见的
接下来我们看物理表
在物理表中我们可以看到 字段 phonenum usernick ydb_sex ydb_province ydb_grade ydb_age ydb_consume ydb_day amtdouble amtlong content
这几个列是可见的,
通过以上测试我们可以验证之前的结论:
使用 all存储方式的字段,在视图表和物理表中均可见,可以使用ydbview_like字段进行模糊检索.
使用combineonly字段只能在物理表中可见,在视图表中不可见,可以通过ydbview_like字段模糊检索.
使用fieldonly在物理表中不可见,只在视图表中可见,不可使用ydbview_like字段模糊检索.
对于YDB视图表的查询方式与普通YDB物理表查询方式是一样的,视图表对应的物理表查询与普通的物理表有所不同
我们可以看到如果使用select * 的方式查询到的物理表数据是两个列,ydbview_name列存储的是视图表的名称,ydbview_like 字段存储的是使用all,combineonly存储方式的聚合列
,如果想要返回指定列的结果,需要在 select 后面指定想要查的字段,例如
select phonenum,usernick from ydb_physical_table where ydbpartition=‘3000w‘ and ydbview_name=‘ydbview_007‘ limit 10
虽然可以返回数据,但是这些数据并不能用于检索,要使用特定的方式
接下来我们通过desc ydbview_007的方式来查看ydbview_007对应的ydb物理表字段名
在上图中我们可以看到左边的红色框中是视图表字段,右边的红色框中是指定的对应物理表字段,如果在建表时未指定物理表对应字段将会自动创建一个字段进行关联,在这里我么看到ydb_day的对应物理表字段为‘v_1_y_string_id ’
接下来我们查询这个字段,并通过特定的方式过滤
select ydbview_name,v_1_y_string_id,ydbview_like from ydb_physical_table where ydbpartion = ‘3000w‘ and ydbview_like like ‘@@[email protected]‘ order by v_1_y_string_id desc limit 10;
在上图中我们看到,我们查询了phonenum 值为 13882555844的ydb_day数据,且按照该字段进行排序,其中
ydbview_like like ‘@@[email protected]‘
是固定写法 ‘@@字段名@对应的值’
有关YDB视图表使用方法就介绍到这里了,如果您对于YDB的功能及产品还存有疑问可以通过以下方式获取试用及技术支持
(如果您无法获取清晰的二维码信息,可单击下图放大↓)
原文地址:http://blog.51cto.com/13596934/2068939