首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >分布式物化视图在clickhouse如何实现?

分布式物化视图在clickhouse如何实现?

作者头像
公众号-利志分享
发布2022-04-25 09:22:41
发布2022-04-25 09:22:41
3.7K1
举报
文章被收录于专栏:利志分享利志分享

物化视图在数据层面做指标大宽表有着举足轻重的作用,分布式物化视图是对物化视图存储的数据进行分布式读取。

之前我们有一个介绍过物化视图的文章,详情请点击:clickhouse物化视图的应用,这里我们已经介绍过物化视图是什么,如何使用。

下面我们这里来介绍一下分布式物化视图的使用。我们这里使用的是分布式clickhouse集群。版本是:20.3.10.75,下面我们就来详解分布式物化视图在clickhouse的使用。

1:首先我们还是来建立三个表。

代码语言:javascript
复制
use my_test
CREATE TABLE user on cluster ch_cluster ( user_id UInt16,phone String,name String,create_time DateTime ) ENGINE = MergeTree() PARTITION BY toYYYYMM(create_time) ORDER BY (user_id) SETTINGS index_granularity = 8192;
CREATE TABLE bind on cluster ch_cluster ( user_id UInt16,phone String,create_time DateTime ) ENGINE = MergeTree() PARTITION BY toYYYYMM(create_time) ORDER BY (user_id) SETTINGS index_granularity = 8192;
CREATE TABLE user_info on cluster ch_cluster ( user_id UInt16,sig String,node String,create_time DateTime ) ENGINE = MergeTree() PARTITION BY toYYYYMM(create_time) ORDER BY (user_id) SETTINGS index_granularity = 8192;

2:分别在不同的节点插入数据,我这里有两个节点,我们每个节点插入如下数据。

节点1如下:

代码语言:javascript
复制
insert into user values(1,'18475484454','张三',now()),(2,'18465484454','李四',now()),(3,'','王五',now()),(4,'','小狗',now())
insert into bind values(1,'18475484454',now()),(3,'18475484457',now())
insert into user_info values(1,'我的地盘我做主','我的签名',now()),(3,'我的地盘我做主2','我的签名2',now())

节点2如下:

代码语言:javascript
复制
insert into user values(8,'18475484454','张三4',now()),(5,'18465484454','李四5',now()),(6,'','王五6',now()),(7,'','小狗7',now())
insert into bind values(7,'18475484454',now()),(5,'18475484457',now())
insert into user_info values(4,'我的地盘我做主','我的签名4',now()),(6,'我的地盘我做主6','我的签名6',now())

3:插入完数据之后,我们去每个节点查询,因为我们需要读所有的数据,则我们需要建一下分布式表来读数据。下面是建分布式表的语句。

代码语言:javascript
复制
CREATE TABLE my_test.user_all on cluster ch_cluster(user_id UInt16,phone String,name String,create_time DateTime) ENGINE = Distributed('ch_cluster', 'my_test', 'user', rand());
CREATE TABLE my_test.bind_all on cluster ch_cluster(user_id UInt16,phone String,create_time DateTime) ENGINE = Distributed('ch_cluster', 'my_test', 'bind', rand());
CREATE TABLE my_test.user_info_all on cluster ch_cluster(user_id UInt16,sig String,node String,create_time DateTime) ENGINE = Distributed('ch_cluster', 'my_test', 'user_info', rand());

建立好上面的分布式表之后就能读集群所有节点的数据了。我这里贴一下user表的所有数据。

4:上面是基础的数据表,这里我们开始建物化视图表。下面的sql是把用户表,用户信息表,绑定表进行组合成大宽表,下面的脚本我们是在每个节点上存了一份快照,实际业务中我们是写数据到一个节点,不会一份数据存多份。我这里做例子就这么使用。

代码语言:javascript
复制
CREATE MATERIALIZED VIEW my_test.big_user_view  on cluster ch_cluster ENGINE = MergeTree() PARTITION BY toYYYYMM(a.create_time) ORDER BY (a.user_id) POPULATE AS select a.user_id,a.name,a.create_time,b.phone,c.sig,c.node from my_test.user_all a global left join my_test.bind_all as b on a.user_id=b.user_id global left join my_test.user_info_all c on a.user_id=c.user_id;

5:上面的物化视图表我们建立好了,下面我们在物化视图表上建分布式表。

代码语言:javascript
复制
CREATE TABLE my_test.big_user_view_all on cluster ch_cluster as my_test.big_user_view ENGINE = Distributed('ch_cluster', 'my_test', 'big_user_view', rand());

好了,到这里我们已经可以通过物化视图分布式表读每个节点的物化视图了,业务中我们基于物化视图来做大宽表,读取物化视图分布式表是非常常见的。我之前记得之前有一篇"clickhouse物化视图在微信中应用"也是比较类似。

总结:

1:物化视图和普通表都可以建立分布式表。

2:物化视图分布式表常用于业务的大宽表使用。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-08-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 利志分享 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档