• 大数据ClickHouse(十):MergeTree系列表引擎之SummingMergeTree


    文章目录

    MergeTree系列表引擎之SummingMergeTree

    一、SummingMergeTree基本讲解

    二、使用SummingMergeTree注意以下几点

    三、测试实例

    1、测试不指定聚合字段同时测试不同分区内,相同排序key数据不会被合并

    2、测试指定一个聚合字段

    3、测试指定多个聚合字段


    MergeTree系列表引擎之SummingMergeTree

    一、SummingMergeTree基本讲解

    该引擎继承了MergeTree引擎,当合并 SummingMergeTree 表的数据片段时,ClickHouse 会把所有具有相同主键的行合并为一行,该行包含了被合并的行中具有数值数据类型的列的汇总值,即如果存在重复的数据,会对对这些重复的数据进行合并成一条数据,类似于group by的效果,可以显著减少存储空间并加快数据查询速度。

    如果用户只需要查询数据的汇总结果,不关心明细数据,并且数据的汇总条件是预先明确的,即GROUP BY的分组字段是确定的,可以使用该表引擎。

    • SummingMergeTree建表语句:
    1. CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster]
    2. (
    3. name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1],
    4. name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2],
    5. ...
    6. ) ENGINE = SummingMergeTree([columns])
    7. [PARTITION BY expr]
    8. [ORDER BY expr]
    9. [SAMPLE BY expr]
    10. [SETTINGS name=value, ...]

    对以上建表语句的解释如下:

    [columns]: 将要被汇总的列,或者多个列,多个列需要写在元组中。可选参数。所选的列必须是数值类型,并且不可位于主键中。如果没有指定 [columns],ClickHouse 会把所有不在主键中的数值类型的列都进行汇总。

    二、使用SummingMergeTree注意以下几点

    • SummingMergeTree是根据什么对两条数据进行合并的

    用ORBER BY排序键作为聚合数据的条件Key。即如果排序key是相同的,则会合并成一条数据,并对指定的合并字段进行聚合。

    • 仅对分区内的相同排序key的数据行进行合并

    以数据分区为单位来聚合数据。当分区合并时,同一数据分区内聚合Key相同的数据会被合并汇总,而不同分区之间的数据则不会被汇总。

    • 如果没有指定聚合字段,会怎么聚合

    如果没有指定聚合字段,则会按照非主键的数值类型字段进行聚合。

    • 对于非汇总字段的数据,该保留哪一条

    如果两行数据除了排序字段相同,其他的非聚合字段不相同,那么在聚合发生时,会保留最初的那条数据,新插入的数据对应的那个字段值会被舍弃。

     

    三、测试实例

    1、测试不指定聚合字段同时测试不同分区内,相同排序key数据不会被合并

    1. #创建表 t_summing_mt ,使用SummingMergeTree表引擎
    2. node1 :) create table t_summing_mt(
    3. :-] id UInt8,
    4. :-] name String,
    5. :-] age UInt8,
    6. :-] loc String,
    7. :-] dept String,
    8. :-] workdays UInt8,
    9. :-] salary Decimal32(2)
    10. :-] ) engine = SummingMergeTree()
    11. :-] order by (id,age)
    12. :-] primary key id
    13. :-] partition by loc;
    14. #向表 t_summing_mt 中插入以下数据
    15. node1 :) insert into t_summing_mt values (1,'张三',18,'北京','大数据',24,10000),
    16. :-] (2,'李四',19,'上海','java',22,8000),
    17. :-] (3,'王五',20,'北京','java',26,12000);
    18. #查看表 t_summing_mt 中的数据
    19. node1 :) select * from t_summing_mt;
    20. ┌─id─┬─name─┬─age─┬─loc──┬─dept───┬─workdays─┬───salary─┐
    21. │ 1 │ 张三 │ 18 │ 北京 │ 大数据 │ 24 │ 10000.00 │
    22. │ 3 │ 王五 │ 20 │ 北京 │ java │ 26 │ 12000.00 │
    23. └────┴──────┴─────┴──────┴────────┴──────────┴──────────┘
    24. ┌─id─┬─name─┬─age─┬─loc──┬─dept─┬─workdays─┬──salary─┐
    25. │ 2 │ 李四 │ 19 │ 上海 │ java │ 22 │ 8000.00 │
    26. └────┴──────┴─────┴──────┴──────┴──────────┴─────────┘
    27. #向表 t_summing_mt 中插入一条排序键相同的数据
    28. node1 :) insert into t_summing_mt values (1,'马六',18,'北京','前端',27,15000);
    29. #查看表 t_summing_mt中的数据
    30. node1 :) select * from t_summing_mt;
    31. ┌─id─┬─name─┬─age─┬─loc──┬─dept───┬─workdays─┬───salary─┐
    32. │ 1 │ 张三 │ 18 │ 北京 │ 大数据 │ 24 │ 10000.00 │
    33. │ 3 │ 王五 │ 20 │ 北京 │ java │ 26 │ 12000.00 │
    34. └────┴──────┴─────┴──────┴────────┴──────────┴──────────┘
    35. ┌─id─┬─name─┬─age─┬─loc──┬─dept─┬─workdays─┬───salary─┐
    36. │ 1 │ 马六 │ 18 │ 北京 │ 前端 │ 27 │ 15000.00 │
    37. └────┴──────┴─────┴──────┴──────┴──────────┴──────────┘
    38. ┌─id─┬─name─┬─age─┬─loc──┬─dept─┬─workdays─┬──salary─┐
    39. │ 2 │ 李四 │ 19 │ 上海 │ java │ 22 │ 8000.00 │
    40. └────┴──────┴─────┴──────┴──────┴──────────┴─────────┘
    41. #手动执行optimize 命令触发合并相同分区数据
    42. node1 :) optimize table t_summing_mt;
    43. #查看表 t_summing_mt 中的数据
    44. node1 :) select * from t_summing_mt;
    45. ┌─id─┬─name─┬─age─┬─loc──┬─dept───┬─workdays─┬───salary─┐
    46. │ 1 │ 张三 │ 18 │ 北京 │ 大数据 │ 51 │ 25000.00 │
    47. │ 3 │ 王五 │ 20 │ 北京 │ java │ 26 │ 12000.00 │
    48. └────┴──────┴─────┴──────┴────────┴──────────┴──────────┘
    49. ┌─id─┬─name─┬─age─┬─loc──┬─dept─┬─workdays─┬──salary─┐
    50. │ 2 │ 李四 │ 19 │ 上海 │ java │ 22 │ 8000.00 │
    51. └────┴──────┴─────┴──────┴──────┴──────────┴─────────┘
    52. 注意:我们可以看到当不指定 聚合字段时,有相同排序字段行进行聚合时,会将数值类型的字段进行聚合合并。
    53. #继续向表 t_summing_mt中插入以下数据:
    54. node1 :) insert into t_summing_mt values (1,'张三',18,'南京','java',18,12000);
    55. #查看表 t_summing_mt中的数据
    56. node1 :) select * from t_summing_mt;
    57. ┌─id─┬─name─┬─age─┬─loc──┬─dept─┬─workdays─┬───salary─┐
    58. │ 1 │ 张三 │ 18 │ 南京 │ java │ 18 │ 12000.00 │
    59. └────┴──────┴─────┴──────┴──────┴──────────┴──────────┘
    60. ┌─id─┬─name─┬─age─┬─loc──┬─dept───┬─workdays─┬───salary─┐
    61. │ 1 │ 张三 │ 18 │ 北京 │ 大数据 │ 51 │ 25000.00 │
    62. │ 3 │ 王五 │ 20 │ 北京 │ java │ 26 │ 12000.00 │
    63. └────┴──────┴─────┴──────┴────────┴──────────┴──────────┘
    64. ┌─id─┬─name─┬─age─┬─loc──┬─dept─┬─workdays─┬──salary─┐
    65. │ 2 │ 李四 │ 19 │ 上海 │ java │ 22 │ 8000.00 │
    66. └────┴──────┴─────┴──────┴──────┴──────────┴─────────┘
    67. #手动指定optimize 命令合并相同排序key的数据
    68. node1 :) optimize table t_summing_mt;
    69. #查看表 t_summing_mt中的数据
    70. node1 :) select * from t_summing_mt;
    71. ┌─id─┬─name─┬─age─┬─loc──┬─dept─┬─workdays─┬───salary─┐
    72. │ 1 │ 张三 │ 18 │ 南京 │ java │ 18 │ 12000.00 │
    73. └────┴──────┴─────┴──────┴──────┴──────────┴──────────┘
    74. ┌─id─┬─name─┬─age─┬─loc──┬─dept───┬─workdays─┬───salary─┐
    75. │ 1 │ 张三 │ 18 │ 北京 │ 大数据 │ 51 │ 25000.00 │
    76. │ 3 │ 王五 │ 20 │ 北京 │ java │ 26 │ 12000.00 │
    77. └────┴──────┴─────┴──────┴────────┴──────────┴──────────┘
    78. ┌─id─┬─name─┬─age─┬─loc──┬─dept─┬─workdays─┬──salary─┐
    79. │ 2 │ 李四 │ 19 │ 上海 │ java │ 22 │ 8000.00 │
    80. └────┴──────┴─────┴──────┴──────┴──────────┴─────────┘

     注意:不同分区内相同的排序key的数据不能被合并

    2、测试指定一个聚合字段

    1. #删除表 t_summing_mt,重新创建表 t_summing_mt ,使用SummingMergeTree引擎
    2. node1 :) create table t_summing_mt(
    3. :-] id UInt8,
    4. :-] name String,
    5. :-] age UInt8,
    6. :-] loc String,
    7. :-] dept String,
    8. :-] workdays UInt8,
    9. :-] salary Decimal32(2)
    10. :-] ) engine = SummingMergeTree(salary)
    11. :-] order by (id,age)
    12. :-] primary key id
    13. :-] partition by loc;
    14. #向表 t_summing_mt 中插入以下数据
    15. node1 :) insert into t_summing_mt values (1,'张三',18,'北京','大数据',24,10000),
    16. :-] (2,'李四',19,'上海','java',22,8000),
    17. :-] (3,'王五',20,'北京','java',26,12000);
    18. #查看表 t_summing_mt 中的数据
    19. node1 :) select * from t_summing_mt;
    20. ┌─id─┬─name─┬─age─┬─loc──┬─dept───┬─workdays─┬───salary─┐
    21. │ 1 │ 张三 │ 18 │ 北京 │ 大数据 │ 24 │ 10000.00 │
    22. │ 3 │ 王五 │ 20 │ 北京 │ java │ 26 │ 12000.00 │
    23. └────┴──────┴─────┴──────┴────────┴──────────┴──────────┘
    24. ┌─id─┬─name─┬─age─┬─loc──┬─dept─┬─workdays─┬──salary─┐
    25. │ 2 │ 李四 │ 19 │ 上海 │ java │ 22 │ 8000.00 │
    26. └────┴──────┴─────┴──────┴──────┴──────────┴─────────┘
    27. #向表 t_summing_mt 中插入一条排序键相同的数据
    28. node1 :) insert into t_summing_mt values (1,'马六',18,'北京','前端',27,15000);
    29. #查看表 t_summing_mt中的数据
    30. node1 :) select * from t_summing_mt;
    31. ┌─id─┬─name─┬─age─┬─loc──┬─dept───┬─workdays─┬───salary─┐
    32. │ 1 │ 张三 │ 18 │ 北京 │ 大数据 │ 24 │ 10000.00 │
    33. │ 3 │ 王五 │ 20 │ 北京 │ java │ 26 │ 12000.00 │
    34. └────┴──────┴─────┴──────┴────────┴──────────┴──────────┘
    35. ┌─id─┬─name─┬─age─┬─loc──┬─dept─┬─workdays─┬───salary─┐
    36. │ 1 │ 马六 │ 18 │ 北京 │ 前端 │ 27 │ 15000.00 │
    37. └────┴──────┴─────┴──────┴──────┴──────────┴──────────┘
    38. ┌─id─┬─name─┬─age─┬─loc──┬─dept─┬─workdays─┬──salary─┐
    39. │ 2 │ 李四 │ 19 │ 上海 │ java │ 22 │ 8000.00 │
    40. └────┴──────┴─────┴──────┴──────┴──────────┴─────────┘
    41. #手动执行optimize 命令触发合并相同分区数据
    42. node1 :) optimize table t_summing_mt;
    43. #查看表 t_summing_mt 中的数据
    44. node1 :) select * from t_summing_mt;
    45. ┌─id─┬─name─┬─age─┬─loc──┬─dept───┬─workdays─┬───salary─┐
    46. │ 1 │ 张三 │ 18 │ 北京 │ 大数据 │ 24 │ 25000.00 │
    47. │ 3 │ 王五 │ 20 │ 北京 │ java │ 26 │ 12000.00 │
    48. └────┴──────┴─────┴──────┴────────┴──────────┴──────────┘
    49. ┌─id─┬─name─┬─age─┬─loc──┬─dept─┬─workdays─┬──salary─┐
    50. │ 2 │ 李四 │ 19 │ 上海 │ java │ 22 │ 8000.00 │
    51. └────┴──────┴─────┴──────┴──────┴──────────┴─────────┘

    注意:我们可以看到当指定一个聚合字段时,有相同排序字段行进行聚合时,会按照这个数值字段进行合并,其他的保留最开始一条数据的信息。

    3、测试指定多个聚合字段

    1. #删除表 t_summing_mt,重新创建表 t_summing_mt ,使用SummingMergeTree引擎
    2. node1 :) create table t_summing_mt(
    3. :-] id UInt8,
    4. :-] name String,
    5. :-] age UInt8,
    6. :-] loc String,
    7. :-] dept String,
    8. :-] workdays UInt8,
    9. :-] salary Decimal32(2)
    10. :-] ) engine = SummingMergeTree((salary,workdays))
    11. :-] order by (id,age)
    12. :-] primary key id
    13. :-] partition by loc;
    14. #向表 t_summing_mt 中插入以下数据
    15. node1 :) insert into t_summing_mt values (1,'张三',18,'北京','大数据',24,10000),
    16. :-] (2,'李四',19,'上海','java',22,8000),
    17. :-] (3,'王五',20,'北京','java',26,12000);
    18. #查看表 t_summing_mt 中的数据
    19. node1 :) select * from t_summing_mt;
    20. ┌─id─┬─name─┬─age─┬─loc──┬─dept───┬─workdays─┬───salary─┐
    21. │ 1 │ 张三 │ 18 │ 北京 │ 大数据 │ 24 │ 10000.00 │
    22. │ 3 │ 王五 │ 20 │ 北京 │ java │ 26 │ 12000.00 │
    23. └────┴──────┴─────┴──────┴────────┴──────────┴──────────┘
    24. ┌─id─┬─name─┬─age─┬─loc──┬─dept─┬─workdays─┬──salary─┐
    25. │ 2 │ 李四 │ 19 │ 上海 │ java │ 22 │ 8000.00 │
    26. └────┴──────┴─────┴──────┴──────┴──────────┴─────────┘
    27. #向表 t_summing_mt 中插入一条排序键相同的数据
    28. node1 :) insert into t_summing_mt values (1,'马六',18,'北京','前端',27,15000);
    29. #查看表 t_summing_mt中的数据
    30. node1 :) select * from t_summing_mt;
    31. ┌─id─┬─name─┬─age─┬─loc──┬─dept───┬─workdays─┬───salary─┐
    32. │ 1 │ 张三 │ 18 │ 北京 │ 大数据 │ 24 │ 10000.00 │
    33. │ 3 │ 王五 │ 20 │ 北京 │ java │ 26 │ 12000.00 │
    34. └────┴──────┴─────┴──────┴────────┴──────────┴──────────┘
    35. ┌─id─┬─name─┬─age─┬─loc──┬─dept─┬─workdays─┬───salary─┐
    36. │ 1 │ 马六 │ 18 │ 北京 │ 前端 │ 27 │ 15000.00 │
    37. └────┴──────┴─────┴──────┴──────┴──────────┴──────────┘
    38. ┌─id─┬─name─┬─age─┬─loc──┬─dept─┬─workdays─┬──salary─┐
    39. │ 2 │ 李四 │ 19 │ 上海 │ java │ 22 │ 8000.00 │
    40. └────┴──────┴─────┴──────┴──────┴──────────┴─────────┘
    41. #手动执行optimize 命令触发合并相同分区数据
    42. node1 :) optimize table t_summing_mt;
    43. #查看表 t_summing_mt 中的数据
    44. node1 :) select * from t_summing_mt;
    45. ┌─id─┬─name─┬─age─┬─loc──┬─dept───┬─workdays─┬───salary─┐
    46. │ 1 │ 张三 │ 18 │ 北京 │ 大数据 │ 51 │ 25000.00 │
    47. │ 3 │ 王五 │ 20 │ 北京 │ java │ 26 │ 12000.00 │
    48. └────┴──────┴─────┴──────┴────────┴──────────┴──────────┘
    49. ┌─id─┬─name─┬─age─┬─loc──┬─dept─┬─workdays─┬──salary─┐
    50. │ 2 │ 李四 │ 19 │ 上海 │ java │ 22 │ 8000.00 │
    51. └────┴──────┴─────┴──────┴──────┴──────────┴─────────┘

    注意:我们可以看到当指定多个聚合字段时,有相同排序字段行进行聚合时,会按照指定的多个数值字段进行合并,其他的保留最开始一条数据的信息。


    • 📢博客主页:https://lansonli.blog.csdn.net
    • 📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!
    • 📢本文由 Lansonli 原创,首发于 CSDN博客🙉
    • 📢停下休息的时候不要忘了别人还在奔跑,希望大家抓紧时间学习,全力奔赴更美好的生活✨
  • 相关阅读:
    扫雷游戏(C语言)
    【docker-compose 跨节点部署 kafka-kraft SASL用户加密集群】全网最新!
    Archive Team: The Twitter Stream Grab
    rabbitmq 保姆级安装教程
    IntelliJ IDEA快捷键大全 + 动图演示
    HashMap高频面试题,让你掌握青铜回答与王者级回答,你值得拥有
    什么是谐波?谐波的危害
    主办方:上海视频媒体,多样式多渠道跨屏传播
    JAVA注解
    C陷阱与缺陷 第7章 可移植性缺陷 7.11 可移植性问题的一个例子
  • 原文地址:https://blog.csdn.net/xiaoweite1/article/details/126312457