Go 大数据生态开源项目 CDS 中 ClickHouse 使用的建表方案
实时表
从中可以看出两点:
也就是说数据导入后不考虑变更,而且想要直接分析源数据。
因为上面提到的需求,更新这个功能在随后还是以 mutation 的形式加入了。这种 mutation 形式在官网中:
“Data deduplication occurs only during a merge. Merging occurs in the background at an unknown time, so you can't plan for it. Some of the data may remain unprocessed. Although you can run an unscheduled merge using the OPTIMIZE query, don't count on using it, because the OPTIMIZE query will read and write a large amount of data. Thus, ReplacingMergeTree is suitable for clearing out duplicate data in the background in order to save space, but it doesn't guarantee the absence of duplicates.”
final 关键字就可以得到最终数据,而不用动用 final 也有缺点,就是会导致
MaterializeMySQL也使用了同样的方法 https://github.com/ClickHouse/ClickHouse/issues/4006 。加上如何合理使用 利用
ClickHouse ,数据就可以被自动合并了。
ReplacingMergeTree 合并后会变成这一列,查询时在 where 中添加过滤条件就好了。
)
中的rtu变更
insert` 的操作。
ReplacingMergeTree 具体建表方式如下:
CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster]( name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1], name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2], ...) ENGINE = ReplacingMergeTree([ver])[PARTITION BY expr][ORDER BY expr][SAMPLE BY expr][SETTINGS name=value, ...]
你需要指定一个版本列用于数据合并时确定最新数据,一般指定成
ClickHouse 推荐数据直接插入 clickhosue 集群节点的本地存储表中,而不是通过分布式表插入。这意味着你需要将数据按主键自行散列好后插入对应集群节点的本地存储表。
这种表引擎对
MergeTree
表中。这种表引擎给
历史版本与还原如果只保存增量和变更数据将会节省很多空间,问题是如何从一堆增量和变更数据中还原每一天的数据?
ReplacingMergeTree
表引擎,在上面提到的第 4 点
在 clickhouse 中使用普通argMax
和 合理的分区 方案可以实现版本还原。如:-- 查询某一日全部用户中编辑角色的数量SELECT date , uniq(user_id)FROM ( SELECT date , id user_id , argMax(users.role, users.update_time) role_ FROM ( SELECT id , update_time , role , toDate('2020-11-11') date FROM default.user WHERE create_time < toDateTime(date + INTERVAL 1 DAY) AND update_time < toDateTime(date + INTERVAL 1 DAY) ) users GROUP BY date, id ) day_snap_shot -- 生成当日快照WHERE role_ = 'editor' GROUP BY date;
上面介绍了两种建表方案,一种实时的,一种带有所有版本变更的。两种方案各有优劣,根据使用场景选择。这两种方案都不完美。
项目地址
go-zero 项目地址:https://github.com/tal-tech/go-zero
<p style="box-sizing: border-box;outline-style: none;margin-bottom: 20px;font-size: 15px;line-height: 26px;color: rgb(64, 64, 64);font-family: Helvetica, Arial, " pingfang="" sc",="" "noto="" sans",="" roboto,="" "microsoft="" yahei",="" sans-serif;letter-spacing:="" 0.45px;text-align:="" left;white-space:="" normal;background-color:="" rgb(255,="" 255,="" 255);