当前位置: 首页 > article >正文

07 - Clickhouse之ReplacingMergeTree和SummingMergeTree引擎

目录

一、ReplacingMergeTree引擎

1、简介

2、去重的时机

3、去重范围

4、案例

二、SummingMergeTree引擎

1、简介

2、案例

3、结论


一、ReplacingMergeTree引擎

1、简介

        ReplacingMergeTree 是 MergeTree 的一个变种,它存储特性完全继承 MergeTree,只是多了一个去重的功能。 尽管 MergeTree 可以设置主键,但是 primary key 其实没有唯一约束 的功能。如果你想处理掉重复的数据,可以借助这个 ReplacingMergeTree。

2、去重的时机

        数据的去重只会在合并的过程中出现。合并会在未知的时间在后台进行,所以你无法预 先作出计划。有一些数据可能仍未被处理。

3、去重范围

        如果表经过了分区,去重只会在分区内部进行去重,不能执行跨分区的去重

        所以 ReplacingMergeTree 能力有限, ReplacingMergeTree 适用于在后台清除重复的数 据以节省空间,但是它不保证没有重复的数据出现。

4、案例

创建表

create table t_order_rmt(
    id UInt32,
    sku_id String,
    total_amount Decimal(16,2) ,
    create_time Datetime 
) engine =ReplacingMergeTree(create_time)
partition by toYYYYMMDD(create_time)
primary key (id)
order by (id, sku_id);

ReplacingMergeTree()填入的参数为版本字段,重复数据保留版本字段值最大的。如果不填版本字段,默认按照插入顺序保留最后一条。

插入数据:

insert into t_order_rmt values
(101,'sku_001',1000.00,'2020-06-01 12:00:00') ,
(102,'sku_002',2000.00,'2020-06-01 11:00:00'),
(102,'sku_004',2500.00,'2020-06-01 12:00:00'),
(102,'sku_002',2000.00,'2020-06-01 13:00:00'),
(102,'sku_002',12000.00,'2020-06-01 13:00:00'),
(102,'sku_002',600.00,'2020-06-02 12:00:00');

执行查询操作:

hallo102 :) select * from t_order_rmt;

SELECT *
FROM t_order_rmt

Query id: 7fe15b0c-91c6-4b7a-a735-e71676c84459

┌──id─┬─sku_id──┬─total_amount─┬─────────create_time─┐
│ 102 │ sku_002 │       600.00 │ 2020-06-02 12:00:00 │
└─────┴─────────┴──────────────┴─────────────────────┘
┌──id─┬─sku_id──┬─total_amount─┬─────────create_time─┐
│ 101 │ sku_001 │      1000.00 │ 2020-06-01 12:00:00 │
│ 102 │ sku_002 │     12000.00 │ 2020-06-01 13:00:00 │
│ 102 │ sku_004 │      2500.00 │ 2020-06-01 12:00:00 │
└─────┴─────────┴──────────────┴─────────────────────┘

4 rows in set. Elapsed: 0.005 sec.

hallo102 :)

结论

  • 实际上是使用order by字段作为唯一键进行去重
  • 去重不能跨分区
  • 只有同一批插入(新版本)或合并分区时才会进行去重
  • 认定重复的数据保留,版本字段值最大的
  • 如果版本字段相同则按插入顺序保留最后一笔

二、SummingMergeTree引擎

1、简介

        对于不查询明细,只关心以维度进行汇总聚合结果的场景。如果只使用普通的MergeTree 的话,无论是存储空间的开销,还是查询时临时聚合的开销都比较大。

        ClickHouse为了这种场景,提供了一种能够预聚合的引擎SummingMergeTree

2、案例

create table t_order_smt(
    id UInt32,
    sku_id String,
    total_amount Decimal(16,2) ,
    create_time Datetime 
) engine =SummingMergeTree(total_amount)
partition by toYYYYMMDD(create_time)
primary key (id)
order by (id,sku_id );

插入数据

insert into t_order_smt values
(101,'sku_001',1000.00,'2020-06-01 12:00:00'),
(102,'sku_002',2000.00,'2020-06-01 11:00:00'),
(102,'sku_004',2500.00,'2020-06-01 12:00:00'),
(102,'sku_002',2000.00,'2020-06-01 13:00:00'),
(102,'sku_002',12000.00,'2020-06-01 13:00:00'),
(102,'sku_002',600.00,'2020-06-02 12:00:00');

执行查询操作:

hallo102 :) select * from t_order_smt;

SELECT *
FROM t_order_smt

Query id: 3d625ccb-384f-4141-8bca-d12d96c1a76c

┌──id─┬─sku_id──┬─total_amount─┬─────────create_time─┐
│ 101 │ sku_001 │      1000.00 │ 2020-06-01 12:00:00 │
│ 102 │ sku_002 │     16000.00 │ 2020-06-01 11:00:00 │
│ 102 │ sku_004 │      2500.00 │ 2020-06-01 12:00:00 │
└─────┴─────────┴──────────────┴─────────────────────┘
┌──id─┬─sku_id──┬─total_amount─┬─────────create_time─┐
│ 102 │ sku_002 │       600.00 │ 2020-06-02 12:00:00 │
└─────┴─────────┴──────────────┴─────────────────────┘

4 rows in set. Elapsed: 0.004 sec.

hallo102 :)

3、结论

  • 以SummingMergeTree()中指定的列作为汇总数据列
  • 可以填写多列必须数字列,如果不填,以所有非维度列(除了order by的列之外)且为数字列的字段为汇总数据列
  • 以order by的列为准,作为维度列
  • 其他的列按插入顺序保留第一行
  • 不在一个分区的数据不会被聚合
  • 只有在同一批次插入(新版本)或分片合并时才会进行聚合

http://www.kler.cn/a/405046.html

相关文章:

  • 【赵渝强老师】MySQL的慢查询日志
  • 跨视角差异-依赖网络用于体积医学图像分割|文献速递-生成式模型与transformer在医学影像中的应用
  • 2024年亚太地区数学建模大赛D题-探索量子加速人工智能的前沿领域
  • WPF如何全局应用黑白主题效果
  • 解决Docker环境变量的配置的通用方法
  • 【IDEA】解决总是自动导入全部类(.*)问题
  • django基于python 语言的酒店推荐系统
  • 【青牛科技】芯麦 GC2003:白色家电与安防领域中 ULN2003 的理想替代者
  • 【常用组件整理】
  • QT中使用json格式存取矩阵数据
  • 第 23 章 -Golang 调试技巧
  • 爬虫实战:探索XPath爬虫技巧之热榜新闻
  • 基于Springboot + Vue小区物业管理系统(源码+lw+讲解部署+PPT)
  • 【Diffusion分割】CorrDiff:用于脑肿瘤分割的校正扩散模型
  • 【C++】从C到C++
  • C++结构型设计模式所体现面向接口设计的特征和优点
  • tcpdump交叉编译
  • 什么是JavaScript原型链?
  • CosyVoice 上手即用教程
  • 操作系统进程和线程——针对实习面试
  • 华为仓颉语言的技术梗概,底层原理是什么?什么架构,以后会替换JAVA语言了,信创背景下,要不要开始进入仓颉赛道,详细为您剖析仓颉语言
  • 【初阶数据结构篇】双向链表的实现(赋源码)
  • IDEA:2023版远程服务器debug
  • Kafka 3.5 源码导读
  • 网络安全-网络安全基础
  • Redis自动配置-序列化