|NO.Z.00015|——————————|BigDataEnd|——|Hadoop&OLAP_ClickHouse.V12|——|ClickHouse.v12|MergeTree家族表引擎|ReplacingMergeTree|
一、MergeTree家族表引擎:MergeTree家族表引擎
### --- ReplacingMergeTree
~~~ 这个引擎是在 MergeTree 的基础上,添加了“处理重复数据”的功能,
~~~ 该引擎和MergeTree的不同之处在于它会删除具有相同主键的重复项。
### --- 特点:
~~~ 使用ORDER BY排序键作为判断重复的唯一键
~~~ 数据的去重只会在合并的过程中触发
~~~ 以数据分区为单位删除重复数据,不同分区的的重复数据不会被删除
~~~ 找到重复数据的方式依赖数据已经ORDER BY排好序了
~~~ 如果没有ver版本号,则保留重复数据的最后一行
~~~ 如果设置了ver版本号,则保留重复数据中ver版本号最大的数据
### --- 格式:
~~~ ENGINE [=] ReplacingMergeTree(date-column [, sampling_expression], (primary, key),
~~~ index_granularity, [ver])可以看出他比MergeTree只多了一个ver,这个ver指代版本列。
二、ReplacingMergeTree案例
### --- 案例:创建表并导入数据
~~~ # 创建表
hadoop01 :) create table replace_table( id String, code String, create_time DateTime )ENGINE=ReplacingMergeTree() PARTITION BY toYYYYMM(create_time) ORDER BY (id,code) PRIMARY KEY id;
CREATE TABLE replace_table
(
`id` String,
`code` String,
`create_time` DateTime
)
ENGINE = ReplacingMergeTree()
PARTITION BY toYYYYMM(create_time)
PRIMARY KEY id
ORDER BY (id, code)
Ok.
~~~ # 导入数据
hadoop01 :) insert into replace_table values('A001','C1','2021-11-01 08:00:00');
hadoop01 :) insert into replace_table values('A001','C1','2021-11-02 08:00:00');
hadoop01 :) insert into replace_table values('A001','C8','2021-11-03 08:00:00');
hadoop01 :) insert into replace_table values('A001','C9','2021-11-04 08:00:00');
hadoop01 :) insert into replace_table values('A002','C2','2021-11-05 08:00:00');
hadoop01 :) insert into replace_table values('A003','C3','2021-11-06 08:00:00');
### --- optimize强制触发:
~~~ # 通过观察,去重是根据ORDER BY来的,并非PRIMARY KEY
hadoop01 :) SELECT * FROM replace_table ;
┌─id───┬─code─┬─────────create_time─┐
│ A001 │ C1 │ 2021-11-02 08:00:00 │
│ A001 │ C8 │ 2021-11-03 08:00:00 │
│ A001 │ C9 │ 2021-11-04 08:00:00 │
│ A002 │ C2 │ 2021-11-05 08:00:00 │
└──────┴──────┴─────────────────────┘
┌─id───┬─code─┬─────────create_time─┐
│ A003 │ C3 │ 2021-11-06 08:00:00 │
└──────┴──────┴─────────────────────┘
┌─id───┬─code─┬─────────create_time─┐
│ A001 │ C1 │ 2021-11-01 08:00:00 │
└──────┴──────┴─────────────────────┘
### --- 在继续插入一条数据:
~~~ # 继续插入一条数据
hadoop01 :) insert into replace_table values('A001','C1','2021-10-21 08:00:00');
~~~ # 合并数据
hadoop01 :) OPTIMIZE TABLE replace_table;
~~~ # 查看表分区情况:通过观察,不同分区的数据不会去重。
hadoop01 :) select * from replace_table;
┌─id───┬─code─┬─────────create_time─┐
│ A001 │ C1 │ 2021-10-21 08:00:00 │
└──────┴──────┴─────────────────────┘
┌─id───┬─code─┬─────────create_time─┐
│ A001 │ C1 │ 2021-11-01 08:00:00 │
│ A001 │ C8 │ 2021-11-03 08:00:00 │
│ A001 │ C9 │ 2021-11-04 08:00:00 │
│ A002 │ C2 │ 2021-11-05 08:00:00 │
│ A003 │ C3 │ 2021-11-06 08:00:00 │
└──────┴──────┴─────────────────────┘
Walter Savage Landor:strove with none,for none was worth my strife.Nature I loved and, next to Nature, Art:I warm'd both hands before the fire of life.It sinks, and I am ready to depart
——W.S.Landor
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通