跟着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 在大数据分析领域表现出色。

  • 19
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值