09_ClickHouse,ReplacingMergeTree,案例,根据排序键去重,使用版本参数的去重(学习笔记)
7.ReplacingMergeTree
7.1.ReplacingMergeTree
7.2.案例
7.2.1.示例1:根據排序鍵去重
7.2.2.示例2:使用版本參數的去重
7.ReplacingMergeTree
7.1.ReplacingMergeTree
指定表引擎:
ENGINE = ReplacingMergeTree([ver])
參數:ver,版本列。版本列的類型為UInt*、Date或DateTime。可選參數。
合并的時候,ReplacingTree從所有相同主鍵的行中選擇一行留下:如果ver未指定,選擇最后一條。如果指定了ver列,選擇ver值最大的版本。
7.2.案例
7.2.1.示例1:根據排序鍵去重
建表:
DROP TABLE replacingMergeTreeDemo; CREATE TABLE replacingMergeTreeDemo (UserID UInt32,CounterID UInt32,UserName String,EventDate Date ) ENGINE = ReplacingMergeTree() ORDER BY (UserID, CounterID) PRIMARY KEY (UserID);執行效果:
xxxxx :) CREATE TABLE replacingMergeTreeDemo :-] ( :-] UserID UInt32, :-] CounterID UInt32, :-] UserName String, :-] EventDate Date :-] ) ENGINE = ReplacingMergeTree() :-] ORDER BY (UserID, CounterID) :-] PRIMARY KEY (UserID);CREATE TABLE replacingMergeTreeDemo (`UserID` UInt32,`CounterID` UInt32,`UserName` String,`EventDate` Date ) ENGINE = ReplacingMergeTree() PRIMARY KEY UserID ORDER BY (UserID, CounterID)Ok.0 rows in set. Elapsed: 0.055 sec. xxxxx :)2 插入數據
分三批次插入數據,為了觀察效果,下面的三段腳本依次按順序分別執行,不要一起執行:
批次1:
插入后的效果為:
xxxxx :) select * from replacingMergeTreeDemo;SELECT * FROM replacingMergeTreeDemo┌─UserID─┬─CounterID─┬─UserName─┬──EventDate─┐ │ 3 │ 102 │ xiaohe3 │ 2020-04-23 │ └────────┴───────────┴──────────┴────────────┘ ┌─UserID─┬─CounterID─┬─UserName─┬──EventDate─┐ │ 2 │ 100 │ xiaohe2 │ 2020-04-22 │ └────────┴───────────┴──────────┴────────────┘ ┌─UserID─┬─CounterID─┬─UserName─┬──EventDate─┐ │ 1 │ 100 │ xiaohe1 │ 2020-04-21 │ └────────┴───────────┴──────────┴────────────┘3 rows in set. Elapsed: 0.009 sec. xxxxx :)批次2:
insert into replacingMergeTreeDemo values(3,103,'xiaohe3','2020-04-23'); insert into replacingMergeTreeDemo values(2,101,'xiaohe2','2020-04-24'); insert into replacingMergeTreeDemo values(1,100,'xiaohe1','2020-04-20');插入后的效果為:
xxxxx :) select * from replacingMergeTreeDemo;SELECT * FROM replacingMergeTreeDemo┌─UserID─┬─CounterID─┬─UserName─┬──EventDate─┐ │ 1 │ 100 │ xiaohe1 │ 2020-04-20 │ └────────┴───────────┴──────────┴────────────┘ ┌─UserID─┬─CounterID─┬─UserName─┬──EventDate─┐ │ 1 │ 100 │ xiaohe1 │ 2020-04-21 │ │ 2 │ 100 │ xiaohe2 │ 2020-04-22 │ │ 2 │ 101 │ xiaohe2 │ 2020-04-24 │ │ 3 │ 102 │ xiaohe3 │ 2020-04-23 │ │ 3 │ 103 │ xiaohe3 │ 2020-04-23 │ └────────┴───────────┴──────────┴────────────┘批次3:
insert into replacingMergeTreeDemo values(2,100,'xiaohe2','2020-04-23');插入后的效果:
xxxxx :) select * from replacingMergeTreeDemo; SELECT * FROM replacingMergeTreeDemo┌─UserID─┬─CounterID─┬─UserName─┬──EventDate─┐ │ 2 │ 100 │ xiaohe2 │ 2020-04-23 │ └────────┴───────────┴──────────┴────────────┘ ┌─UserID─┬─CounterID─┬─UserName─┬──EventDate─┐ │ 1 │ 100 │ xiaohe1 │ 2020-04-20 │ └────────┴───────────┴──────────┴────────────┘ ┌─UserID─┬─CounterID─┬─UserName─┬──EventDate─┐ │ 1 │ 100 │ xiaohe1 │ 2020-04-21 │ │ 2 │ 100 │ xiaohe2 │ 2020-04-22 │ │ 2 │ 101 │ xiaohe2 │ 2020-04-24 │ │ 3 │ 102 │ xiaohe3 │ 2020-04-23 │ │ 3 │ 103 │ xiaohe3 │ 2020-04-23 │ └────────┴───────────┴──────────┴────────────┘7 rows in set. Elapsed: 0.007 sec. xxxxx :)如上所示,它并沒有合并數據,這時候需要手工執行計劃外合并。
這時候就要手工執行計劃外合并:
執行命令:optimize table replacingMergeTreeDemo
從這個示例可以發現,ReplacingMergeTree是根據排序項對數據去重的,而不是根據主鍵。
7.2.2.示例2:使用版本參數的去重
在示例1中, 我們簡單觀察可以發現, 去重后,保留的記錄是最后一條記錄。
如果指定了版本,則保留版本列的值最大的記錄。
1.建表
使用EventDate列作為版本字段。
2.插入數據
批次1:
批次2:
insert into replacingMergeTreeDemo values(3,103,'xiaohe3','2020-04-23'); insert into replacingMergeTreeDemo values(2,101,'xiaohe2','2020-04-24'); insert into replacingMergeTreeDemo values(1,100,'xiaohe1','2020-04-20');批次3:
insert into replacingMergeTreeDemo values(2,100,'xiaohe2','2020-04-23');查看數據:
xxxxx :) select * from replacingMergeTreeDemo;SELECT * FROM replacingMergeTreeDemo┌─UserID─┬─CounterID─┬─UserName─┬──EventDate─┐ │ 2 │ 100 │ xiaohe2 │ 2020-04-23 │ └────────┴───────────┴──────────┴────────────┘ ┌─UserID─┬─CounterID─┬─UserName─┬──EventDate─┐ │ 1 │ 100 │ xiaohe1 │ 2020-04-20 │ └────────┴───────────┴──────────┴────────────┘ ┌─UserID─┬─CounterID─┬─UserName─┬──EventDate─┐ │ 1 │ 100 │ xiaohe1 │ 2020-06-21 │ │ 2 │ 100 │ xiaohe2 │ 2020-11-27 │ │ 2 │ 101 │ xiaohe2 │ 2020-04-24 │ │ 3 │ 102 │ xiaohe3 │ 2020-04-23 │ │ 3 │ 103 │ xiaohe3 │ 2020-04-23 │ └────────┴───────────┴──────────┴────────────┘7 rows in set. Elapsed: 0.009 sec. xxxxx :) optimize table replacingMergeTreeDemo;OPTIMIZE TABLE replacingMergeTreeDemoOk.0 rows in set. Elapsed: 0.002 sec. xxxxx :) select * from replacingMergeTreeDemo;SELECT * FROM replacingMergeTreeDemo┌─UserID─┬─CounterID─┬─UserName─┬──EventDate─┐ │ 1 │ 100 │ xiaohe1 │ 2020-06-21 │ │ 2 │ 100 │ xiaohe2 │ 2020-11-27 │ │ 2 │ 101 │ xiaohe2 │ 2020-04-24 │ │ 3 │ 102 │ xiaohe3 │ 2020-04-23 │ │ 3 │ 103 │ xiaohe3 │ 2020-04-23 │ └────────┴───────────┴──────────┴────────────┘5 rows in set. Elapsed: 0.005 sec. xxxxx :)經過上面案例,可以看出,最終保留了如下數據:
│ 2 │ 100 │ xiaohe2 │ 2020-11-27 │從這個示例可以發現, ReplacingMergeTree根據排序項對數據去重的, 保留版本字段列對應的最大值的記錄。
總結
以上是生活随笔為你收集整理的09_ClickHouse,ReplacingMergeTree,案例,根据排序键去重,使用版本参数的去重(学习笔记)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 08_clickhouse主键/索引的工
- 下一篇: 电瓶车控制器怎么调高速?