跟着chatgpt一起学|clickhouse入门(3)MergeTree

跟着chatgpt一起学|2.clickhouse入门(1)-CSDN博客

跟着chatgpt一起学|2.Clickhouse入门(2)-CSDN博客

chatgpt规划的学习路径如下:

3.MergeTree的分类和适用场景

`MergeTree` 引擎是 ClickHouse 中最为强大和多用途的引擎之一,适用于需要高性能读写、数据压缩和实时数据分析的场景。不同的 `MergeTree` 引擎变种针对不同的用例进行了优化。以下是 `MergeTree` 引擎的一些分类和它们的适用场景:

1. MergeTree: 
   - 适用场景:基础的分析型工作负载,需要高效的数据插入和查询性能。
   - 特点:需手动指定分区和排序规则。

2. ReplacingMergeTree:
   - 适用场景:需要自动去除重复数据的应用中,例如,有相同业务主键的最新数据记录。
   - 特点:可以根据某些列合并或替换数据中的重复项。

   - 工作流程:

   1). 数据插入:
      - 当数据被插入到 `ReplacingMergeTree` 表时,它们首先以小的数据块的形式存储在表中。这些插入操作通常很快,因为它们只追加到现有的数据分区中。

   2). 重复数据标识:
      - `ReplacingMergeTree` 引擎允许用户指定一个列(通常称为 `version` 列)来标识数据行的版本。如果没有指定版本列,引擎将使用所有主键列(定义在表的 `ORDER BY` 子句中)来识别重复的记录。

   3). 后台合并过程:
      - ClickHouse 定期在后台进行合并操作,将多个小数据块合并成更大的数据块。在合并过程中,`ReplacingMergeTree` 引擎会检查重复的数据行。
      - 如果两行具有相同的主键列值,但不同的 `version` 值,较老版本的行将被较新版本的行替换。如果未指定 `version` 列,则所有除最后插入一行之外的重复行都将被删除。

   4). 去重:
      - 通过合并操作,`ReplacingMergeTree` 引擎确保表中不会保留重复的数据。最终,每个主键值只对应一个数据行,通常是版本值最高的行。

   5). 查询时去重:
      - 即使在合并操作发生之前,查询也能返回去重后的数据。ClickHouse 的查询处理器能够在读取数据时动态地去除重复的行。

CREATE TABLE example (
    Date Date,
    UserID UInt32,
    CounterID UInt32,
    Version UInt32,
    Value UInt32
) ENGINE = ReplacingMergeTree(Version)
PARTITION BY toYYYYMM(Date)
ORDER BY (UserID, CounterID, Date);

在这个例子中,`Version` 列被用作版本控制,用于标识数据行的版本。在合并时,ClickHouse 将保留 `Version` 值最大的数据行,并去除其他重复的行。如果没有指定 `Version` 列,所有非最后插入的重复行都将在合并时被去除。

3. SummingMergeTree:
   - 适用场景:适合于那些需要自动聚合数值字段的场景,例如,当需要总结相同维度的指标时。
   - 特点:在查询时自动求和具有相同排序键的行

   - 工作流程:与ReplacingMergeTree类似,只不过把去重改为了累加和,如果没有指定响应的列,引擎将对所有数值列进行求和。

CREATE TABLE page_views (
    Date Date,
    Page String,
    Views UInt32,
    Clicks UInt32
) ENGINE = SummingMergeTree()
PARTITION BY toYYYYMM(Date)
ORDER BY (Date, Page);

如果仅想对个别列求和:ENGINE = SummingMergeTree(Value1)

CREATE TABLE example (
    Date Date,
    Category String,
    Value1 Int64,
    Value2 Int64,
    NonSummedValue Int64
) ENGINE = SummingMergeTree(Value1)
PARTITION BY toYYYYMM(Date)
ORDER BY (Date, Category)
SETTINGS index_granularity = 8192;

4. AggregatingMergeTree:
   - 适用场景:用于存储预聚合的数据,非常适合需要快速聚合查询的数据仓库。
   - 特点:能够存储和处理 ClickHouse 特有的聚合数据类型。

   - 工作流程: 和上面类似,但在插入数据时,你需要提供聚合数据而不是原始数据。这通常通过使用 `AggregateFunction` 类型的列和聚合函数(如 `sum()`, `count()`, `min()`, `max()`, `any()`, 等)来完成。在写入之前,数据在内存中预聚合。

CREATE TABLE agg_table (
    Date Date,
    Key String,
    Value AggregateFunction(sum, UInt64)
) ENGINE = AggregatingMergeTree()
PARTITION BY toYYYYMM(Date)
ORDER BY (Date, Key);

在这个例子中,`Value` 列被定义为类型 `AggregateFunction(sum, UInt64)`,表示它存储由 `sum` 聚合函数产生的数据。当数据合并时,同一日期 (`Date`) 和键 (`Key`) 的 `Value` 列会使用 `sumMerge` 函数来合并。

  • 插入数据:

使用聚合函数相应的-State函数

INSERT INTO example (date, key, value)
VALUES ('2021-01-01', 1, sumState(100));
  • 读取数据

使用聚合函数相应的-Merge函数

SELECT
    date,
    key,
    sumMerge(value) AS total
FROM example
GROUP BY date, key;

在使用 `AggregatingMergeTree` 时,一定要注意在插入数据前对其进行预聚合,并且在查询时使用相应的 `-Merge` 后缀的聚合函数来获取最终结果。这样,你就可以充分利用 `AggregatingMergeTree` 引擎的高效聚合能力。

5. CollapsingMergeTree:
   - 适用场景:当你需要动态地合并和折叠记录来进行数据去重时。
   - 特点:使用一个名为 `Sign` 的列来标记数据行的状态,用于在查询时动态折叠重复数据。

   - 工作流程:

        1) 创建表

创建一个 `CollapsingMergeTree` 类型的表,并指定一个 `Sign` 列,该列的类型必须为 `Int8`。`Sign` 列的值通常为 `1` 或 `-1`,分别代表增加或减少数据。

CREATE TABLE example (
    date Date,
    key UInt64,
    value UInt64,
    Sign Int8
) ENGINE = CollapsingMergeTree(Sign)
ORDER BY (date, key);

        2). 插入数据

当插入新数据时,如果数据是新增的,`Sign` 列的值应该为 `1`。如果数据是用于抵消之前的数据的,`Sign` 列的值应该为 `-1`。

-- 插入一条正常记录 
INSERT INTO example (date, key, value, Sign) VALUES ('2021-01-01', 1, 100, 1); 
-- 插入一条用于与先前记录抵消的记录 
INSERT INTO example (date, key, value, Sign) VALUES ('2021-01-01', 1, 100, -1);

        3). 合并数据:

`CollapsingMergeTree` 表的合并操作发生在后台,它会自动合并具有相同排序键的行,并且根据 `Sign` 列的值来增加或减少计数。合并过程会对具有相同排序键的所有行的 `Sign` 值求和,如果总和为零,则这些行将从表中删除。

         4). 查询数据:

在查询时,通常使用 `GROUP BY` 子句和聚合函数来获取最终结果。查询时一般会使用 `sum` 函数对 `Sign` 列求和,以确保抵消的记录不会影响最终的聚合结果。

SELECT
    date,
    key,
    sum(value * Sign) AS total_value
FROM example
GROUP BY date, key;

在上面的查询中,通过将 `value` 与 `Sign` 相乘,我们能够得到最终的总和 `total_value`,其中包括所有记录的累加和减去所有被抵消的记录。

`CollapsingMergeTree` 表引擎的一个关键特性是,它能够有效地处理和简化数据更新和删除操作,因为你只需要插入新的带有相应 `Sign` 值的记录来表示这些更改。在 ClickHouse 进行数据合并时,它会自动处理这些记录的增加和抵消操作。

6. VersionedCollapsingMergeTree:
   - 适用场景:适用于需要维护数据的历史版本的场景,例如,记录数据变更历史。
   - 特点:提供行的版本控制机制,可以保留数据的多个版本。

7. GraphiteMergeTree:
   - 适用场景:专门为 Graphite 监控系统设计,适用于处理 Graphite 时间序列数据。
   - 特点:对 Graphite 的数据保留和聚合规则提供了特殊的支持。

选择合适的 `MergeTree` 引擎时,需要考虑数据的特性、更新频率、查询模式以及是否需要特殊的数据去重或聚合逻辑。`MergeTree` 引擎的高效数据存储和查询能力使得 ClickHouse 在大数据分析领域表现出色。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/233895.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

linux Ubuntu下,第一个C++程序访问数据库,遇到的问题,及解决办法

在ubuntu下安装了mysql&#xff0c;mysql以后&#xff0c;编写了第一个访问数据库的程序&#xff1a; #include <iostream> #include <string> #include <cstdlib> //for system #include <mysql.h>using namespace std;int main() {mysqlpp::Connect…

文心一言API(高级版)使用

文心一言API高级版使用 一、百度文心一言API(高级版)二、使用步骤1、接口2、请求参数3、请求参数示例4、接口 返回示例 三、 如何获取appKey和uid1、申请appKey:2、获取appKey和uid 四、重要说明 一、百度文心一言API(高级版) 基于百度文心一言语言大模型的智能文本对话AI机器…

C语言指针基础题(一)

目录 例题一题目解析答案 例题二题目解析答案 例题三题目解析答案 例题四题目解析答案 例题五题目解析答案 例题六题目解析答案 例题七题目解析答案 感谢各位大佬对我的支持,如果我的文章对你有用,欢迎点击以下链接 &#x1f412;&#x1f412;&#x1f412; 个人主页 &#x…

简易加减运算器的制作----数字电路设计(含proteus仿真)

简易加减运算器的制作 一、功能要求—基本功能 1、自制0-9按键&#xff0c;在一个LED数码管上稳定地显示当前按下的值。&#xff08;基本功能&#xff09; 2、增加、两个按键&#xff0c;实现0-9两个一位数的加法运算&#xff0c;同时在两位LED上稳定地显示运算结果。&#…

猿人学第一题 js混淆 双重加密(详解)

当我们点击分页的时候可以确定这个请求过程是ajax请求&#xff0c;所以直接使用抓包工具找到储存信息的请求。 找到这个请求之后&#xff0c;我们明显发现?后面的参数m是一个加密过的 由于这个请求属于ajax请求&#xff0c;现在我们可以直接使用xhr断点调试找到位置 打上断电…

基础漏洞流量分析

基础漏洞流量分析 sql注入 sql注入原理 SQL 注入的攻击行为可以描述为通过用户可控参数中注入 SQL 语法&#xff0c;破坏原有 SQL 结构&#xff0c;达到编写程序时意料之外结果的攻击行为。其成因可以归结为以下两个原因叠加造成的: 程序员在处理程序和数据库交互时&#x…

Redis | Redis入门学习介绍及常见原理剖析

关注wx&#xff1a;CodingTechWork Redis介绍 概述 Redis是NoSQL&#xff0c;是key-value分布式内存数据库。 缓存 缓存是将数据从慢的介质换到快的介质上&#xff0c;提高读写效率和性能&#xff0c;并降低数据库的读写成本。内存的速度一般都远远大于硬盘的速度&#xf…

arm-none-eabi-gcc not find

解决办法&#xff1a;安装&#xff1a;gcc-arm-none-eabi sudo apt install gcc-arm-none-eabi; 如果上边解决问题了就不用管了&#xff0c;如果解决不了&#xff0c;加上下面这句试试运气&#xff1a; $ sudo apt-get install lsb-core看吧方正我是运气还不错&#xff0c;感…

kafka学习笔记--如何保证生产者数据可靠、不重复、有序

本文内容来自尚硅谷B站公开教学视频&#xff0c;仅做个人总结、学习、复习使用&#xff0c;任何对此文章的引用&#xff0c;应当说明源出处为尚硅谷&#xff0c;不得用于商业用途。 如有侵权、联系速删 视频教程链接&#xff1a;【尚硅谷】Kafka3.x教程&#xff08;从入门到调优…

改进YOLOv8注意力系列一:结合ACmix、Biformer、BAM注意力机制

🗝️改进YOLOv8注意力系列一:结合ACmix、Biformer、BAM注意力机制 代码ACmixBiFormerBAMBlock加入方法各种yaml加入结构本文提供了改进 YOLOv8注意力系列包含不同的注意力机制以及多种加入方式,在本文中具有完整的代码和包含多种更有效加入YOLOv8中的yaml结构,读者可以获…

【flink番外篇】1、flink的23种常用算子介绍及详细示例(完整版)

Flink 系列文章 一、Flink 专栏 Flink 专栏系统介绍某一知识点&#xff0c;并辅以具体的示例进行说明。 1、Flink 部署系列 本部分介绍Flink的部署、配置相关基础内容。 2、Flink基础系列 本部分介绍Flink 的基础部分&#xff0c;比如术语、架构、编程模型、编程指南、基本的…

Linux系统编程:进程间通信总结

管道 在Linux中&#xff0c;管道是一种进程间通信方式&#xff0c;它允许一个进程&#xff08;写入端&#xff09;将其输出直接连接到另一个进程&#xff08;读取端&#xff09;的输入。从本质上说&#xff0c;管道也是一种文件&#xff0c;但它又和一般的文件有所不同。 具体…

SpringMvc入坑系列(一)----maven插件启动tomcat

springboot傻瓜式教程用久了&#xff0c;回过来研究下SSM的工作流程&#xff0c;当然从Spring MVC开始&#xff0c;从傻瓜式入门处理请求和页面交互&#xff0c;再到后面深入源码分析。 本人写了一年多的后端和半年多的前端了。用的都是springbioot和vue&#xff0c;源码一直来…

【视频笔记】古人智慧与修行

古人的智慧 相由心生、老子悟道、佛祖成佛 多一些思考&#xff0c;多一些精神修炼。 除非我们今天能够产生与人类科技发展相并行的精神变革&#xff0c;否则永远可能也无法跳脱出历史的轮回。 视频来源

爬虫学习-基础库的使用(urllib库)

目录 一、urllib库介绍 二、request模块使用 &#xff08;1&#xff09;urlopen ①data参数 ②timeout参数 &#xff08;2&#xff09;request &#xff08;3&#xff09;高级用法 ①验证 ②代理 ③Cookie 三、处理异常 ①URLError ②HTTPError 四、解析链接 ①urlparse ②…

【C语言】结构体内存对齐

目录 引入结构体 结构的声明 创建和初始化 内部元素的使用&#xff1b; 特殊声明&#xff1a; 结构体在内存中的对齐 练习&#xff1a; 引入结构体 C语言有各种数据类型&#xff0c;我们已经对一些数据类型很熟悉&#xff1a; 整型&#xff08;int&#xff09;- 存储整…

108. 将有序数组转换为二叉搜索树

给你一个整数数组 nums &#xff0c;其中元素已经按 升序 排列&#xff0c;请你将其转换为一棵 高度平衡 二叉搜索树。 高度平衡 二叉树是一棵满足「每个节点的左右两个子树的高度差的绝对值不超过 1 」的二叉树。 示例 1&#xff1a; 输入&#xff1a;nums [-10,-3,0,5,9] 输…

06-React组件 Redux React-Redux

React组件化&#xff08;以Ant-Design为例&#xff09; 组件化编程&#xff0c;只需要去安装好对应的组件&#xff0c;然后通过各式各样的组件引入&#xff0c;实现快速开发 我们这里学习的是 Ant-design &#xff08;应该是这样&#xff09;&#xff0c;它有很多的组件供我们…

kali linux使用Proxmark3

其实kali linux下已经集成了Proxmark3命令&#xff0c;但是由于Proxmark3是开源设备&#xff0c;有时候系统默认安装的版本并不能很好的使用&#xff0c;因此需要手动编译最新的版本。 step 1 准备Proxmark3编译环境&#xff0c;因为kali linux比较激进&#xff0c;很多老旧的…

【EI会议征稿中】第三届信号处理与通信安全国际学术会议(ICSPCS 2024)

第三届信号处理与通信安全国际学术会议&#xff08;ICSPCS 2024&#xff09; 2024 3rd International Conference on Signal Processing and Communication Security 信号处理和通信安全是现代信息技术应用的重要领域&#xff0c;近年来这两个领域的研究相互交叉促进&#xf…
最新文章