ToB企服应用市场:ToB评测及商务社交产业平台

标题: 大数据-139 - ClickHouse 集群 表引擎详解4 - MergeTree 实测案例 Replacin [打印本页]

作者: 渣渣兔    时间: 2024-9-24 04:27
标题: 大数据-139 - ClickHouse 集群 表引擎详解4 - MergeTree 实测案例 Replacin
点一下关注吧!!!非常感谢!!持续更新!!!

现在已经更新到了:


章节内容

上节我们完成了如下的内容:


ReplacingMergeTree

简介

这个引擎是在MergeTree的底子上,添加了处理重复数据的功能,该引擎和MergeTree的不同之处在于它会删除具有相同主键的重复项。
特点


案例

创建新表

  1. CREATE TABLE replace_table (
  2.   id String,
  3.   code String,
  4.   create_time DateTime
  5. ) ENGINE = ReplacingMergeTree()
  6. PARTITION BY toYYYYMM(create_time)
  7. ORDER BY (id, code)
  8. PRIMARY KEY id;
复制代码
运行结果如下图所示:

插入数据

  1. INSERT INTO replace_table VALUES ('A001', 'C1', '2024-08-01 08:00:00');
  2. INSERT INTO replace_table VALUES ('A001', 'C1', '2024-08-02 08:00:00');
  3. INSERT INTO replace_table VALUES ('A001', 'C8', '2024-08-03 08:00:00');
  4. INSERT INTO replace_table VALUES ('A001', 'C9', '2024-08-04 08:00:00');
  5. INSERT INTO replace_table VALUES ('A002', 'C2', '2024-08-05 08:00:00');
  6. INSERT INTO replace_table VALUES ('A003', 'C3', '2024-08-06 08:00:00');
复制代码
运行结果如下所示:

optimize

首先说一下,optimize的作用是:

  1. SELECT
  2.   *
  3. FROM
  4.   replace_table;
复制代码
运行结果如下图所示,通过观察,去重是根据ORDER BY来的,并非 PRIMARY KEY:

继续插入一条数据:
  1. INSERT INTO replace_table VALUES('A001', 'c1', '2024-01-01 08:00:00')
复制代码
实行结果如下所示:

观察上图可以看出,不同分区的数据不会去重。
SummingMergeTree

简介

该引擎来自MergeTree,区别在于,当合并SummingMergeTree表的数据片断时,ClickHouse会把全部具有相同聚合数据的条件KEY的行合并为一行,该行包罗了被合并的行中具有数值数据范例的列的汇总值。
如果聚合数据的条件KEY的组合方式使得单个键值对应于大量的行,则可以显着减少存储空间并加快数据查询的速度。对于不可加的列,会取一个最先出现的值。
特点


案例1

创建新表

  1. CREATE TABLE smt_table (
  2.   date Date,
  3.   name String,
  4.   a UInt16,
  5.   b UInt16
  6. ) ENGINE = SummingMergeTree(date, (date, name), 8192, (a));
复制代码
运行的结果如下图所示:

插入数据

  1. insert into smt_table (date, name, a, b) values ('2024-08-10', 'a', 1, 2);
  2. insert into smt_table (date, name, a, b) values ('2024-08-10', 'b', 2, 1);
  3. insert into smt_table (date, name, a, b) values ('2024-08-11', 'b', 3, 8);
  4. insert into smt_table (date, name, a, b) values ('2024-08-11', 'b', 3, 8);
  5. insert into smt_table (date, name, a, b) values ('2024-08-11', 'a', 3, 1);
  6. insert into smt_table (date, name, a, b) values ('2024-08-12', 'c', 1, 3);
复制代码
运行结果如下所示:

optimize

等候一段时间,或者手动 optimize table 来触发合并,再查询信息:
  1. OPTIMIZE TABLE smt_table;
  2. SELECT
  3.   *
  4. FROM
  5.   smt_table;
复制代码
实行结果如下图所示:

通过观察,我们会发现,2024-08-11, b 和 a 列合并相加了,b列取了8(因为b列为8的数据最先插入的)
案例2

创建新表

  1. CREATE TABLE summing_table(
  2.   id String,
  3.   city String,
  4.   v1 UInt32,
  5.   v2 Float64,
  6.   create_time DateTime
  7. ) ENGINE = SummingMergeTree()
  8. PARTITION BY toYYYYMM(create_time)
  9. ORDER BY (id, city);
复制代码
实行结果如下图:

插入数据

  1. insert into table summing_table values('A000','beijing',10,20,'2024-08-20 08:00:00');
  2. insert into table summing_table values('A000','beijing',20,30,'2024-08-30 08:00:00');
  3. insert into table summing_table values('A000','shanghai',10,20,'2024-08-20 08:00:00');
  4. insert into table summing_table values('A000','beijing',10,20,'2024-06-20 08:00:00');
  5. insert into table summing_table values('A001','beijing',50,60,'2024-02-20 08:00:00');
复制代码
实行结果如下图所示:

optimize

  1. OPTIMIZE TABLE summing_table;
  2. SELECT
  3.   *
  4. FROM
  5.   summing_table;
复制代码
实行结果如下图所示:

通过观察,根据ORDER BY排序键(id, city)作为聚合KEY,因为没有在建表时指定SummingMergeTree的SUM列,所以把全部非主键数值范例的列都进行了SUM处理。
案例3

SummingMergeTree支持嵌套范例的字段,但列字段名称必须以Map后缀结束。
创建新表

  1. CREATE TABLE summing_table_nested(
  2.   id String,
  3.   nestMap Nested(
  4.     id UInt32,
  5.     key UInt32,
  6.     val UInt64
  7.   ),
  8.   create_time DateTime
  9. ) ENGINE = SummingMergeTree()
  10. PARTITION BY toYYYYMM(create_time)
  11. ORDER BY id;
复制代码
实行的结果如下图所示:

插入数据

  1. INSERT INTO summing_table_nested VALUES ('1', [101, 102], [201, 202], [1001, 1002], '2024-08-01 10:00:00');
  2. INSERT INTO summing_table_nested VALUES ('2', [103, 104], [203, 204], [1003, 1004], '2024-08-01 10:00:00');
  3. INSERT INTO summing_table_nested VALUES ('1', [105, 106], [205, 206], [1005, 1006], '2024-08-01 10:00:00');
  4. INSERT INTO summing_table_nested VALUES ('2', [107, 108], [207, 208], [1007, 1008], '2024-08-02 10:00:00');
  5. INSERT INTO summing_table_nested VALUES ('3', [109, 110], [209, 210], [1009, 1010], '2024-08-02 10:00:00');
  6. INSERT INTO summing_table_nested VALUES ('4', [111, 112], [211, 212], [1011, 1012], '2024-08-02 10:00:00');
复制代码
实行过程如下图所示:

实行过程如下图所示:

可以看到,我们插入了6条数据,但是查询到的只有4条,而且此外也进行计算的SUM处理。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4