【ClickHouse 探秘】你知道 ClickHouse MergeTree 引擎吗?

news2024/12/27 10:32:52

👉博主介绍: 博主从事应用安全和大数据领域,有8年研发经验,5年面试官经验,Java技术专家,WEB架构师,阿里云专家博主,华为云云享专家,51CTO 专家博主

⛪️ 个人社区:个人社区
💞 个人主页:个人主页
🙉 专栏地址: ✅ Java 中级
🙉八股文专题:剑指大厂,手撕 Java 八股文

在这里插入图片描述

文章目录

      • 1. ClickHouse MergeTree 引擎应用场景
      • 2. ClickHouse MergeTree 引擎如何使用
      • 3. ClickHouse MergeTree 引擎底层原理
      • 4. ClickHouse MergeTree 引擎 Java 代码

1. ClickHouse MergeTree 引擎应用场景

MergeTree 引擎 是 ClickHouse 最常用的表引擎,特别适用于大规模数据存储和分析。以下是一些典型的应用场景:

  • 实时数据分析:适用于需要实时处理和分析大量数据的场景,如实时监控、日志分析等。
  • 数据仓库:作为数据仓库的一部分,用于存储和分析历史数据,支持复杂的查询和聚合操作。
  • 物联网数据:处理来自传感器和其他 IoT 设备的大量数据,支持高效的数据检索和分析。
  • 广告分析:分析广告点击率、转化率等指标,支持快速生成报表。
  • 金融分析:处理交易数据,支持复杂的金融分析和风险管理。

2. ClickHouse MergeTree 引擎如何使用

创建表

CREATE TABLE my_table
(
    id UInt64,
    timestamp DateTime,
    value Float64
)
ENGINE = MergeTree()
PARTITION BY toYYYYMM(timestamp)
ORDER BY (id, timestamp)
TTL timestamp + INTERVAL 1 YEAR DELETE;

解释

  • id UInt64:定义一个无符号 64 位整数类型的列。
  • timestamp DateTime:定义一个日期时间类型的列。
  • value Float64:定义一个浮点数类型的列。
  • PARTITION BY toYYYYMM(timestamp):按年月对数据进行分区。
  • ORDER BY (id, timestamp):指定排序键,用于优化查询性能。
  • TTL timestamp + INTERVAL 1 YEAR DELETE:设置数据保留策略,数据在一年后自动删除。

插入数据

INSERT INTO my_table (id, timestamp, value) VALUES (1, '2023-10-01 00:00:00', 10.5);

查询数据

SELECT * FROM my_table WHERE id = 1 AND timestamp >= '2023-10-01 00:00:00' AND timestamp < '2023-10-02 00:00:00';

3. ClickHouse MergeTree 引擎底层原理

数据存储

  • 列式存储:数据按列存储,每一列单独存储在一个文件中,有利于压缩和查询性能。
  • 分区:数据可以根据指定的列(如日期)进行分区,每个分区可以独立管理和查询。
  • 排序:数据在写入时按指定的排序键进行排序,这有助于提高查询性能,特别是范围查询和聚合查询。

数据写入

  • 批量写入:数据通常以批量的方式写入,每个批次的数据会生成一个新的数据块。
  • 合并:数据块会定期进行合并,以减少数据文件的数量,提高查询性能。合并过程中会删除重复的数据,进行数据压缩。

数据读取

  • 索引:ClickHouse 使用稀疏索引(Sparse Index)来加速查询。稀疏索引记录了每个数据块的最小值和最大值,查询时可以跳过不相关的数据块。
  • 预读:ClickHouse 会预读数据块,以提高读取性能。

数据保留

  • TTL:可以设置数据保留策略,数据超过指定的时间后会被自动删除。

4. ClickHouse MergeTree 引擎 Java 代码

以下是一个简单的 Java 伪代码示例,展示如何使用 ClickHouse 的 MergeTree 引擎进行数据插入和查询。

依赖
首先,添加 ClickHouse JDBC 驱动依赖:

<dependency>
    <groupId>ru.yandex.clickhouse</groupId>
    <artifactId>clickhouse-jdbc</artifactId>
    <version>0.3.2</version>
</dependency>

创建表

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;

public class ClickHouseExample {
    public static void main(String[] args) {
        String url = "jdbc:clickhouse://localhost:8123/default";
        String user = "default";
        String password = "";

        try (Connection conn = DriverManager.getConnection(url, user, password);
             Statement stmt = conn.createStatement()) {

            // 创建表
            String createTableSQL = "CREATE TABLE IF NOT EXISTS my_table (" +
                    "id UInt64," +
                    "timestamp DateTime," +
                    "value Float64" +
                    ") ENGINE = MergeTree() PARTITION BY toYYYYMM(timestamp) ORDER BY (id, timestamp) TTL timestamp + INTERVAL 1 YEAR DELETE;";
            stmt.execute(createTableSQL);

            System.out.println("Table created successfully.");

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

插入数据

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;

public class ClickHouseInsertExample {
    public static void main(String[] args) {
        String url = "jdbc:clickhouse://localhost:8123/default";
        String user = "default";
        String password = "";

        try (Connection conn = DriverManager.getConnection(url, user, password)) {
            // 插入数据
            String insertSQL = "INSERT INTO my_table (id, timestamp, value) VALUES (?, ?, ?)";
            PreparedStatement pstmt = conn.prepareStatement(insertSQL);
            pstmt.setLong(1, 1);
            pstmt.setString(2, "2023-10-01 00:00:00");
            pstmt.setDouble(3, 10.5);
            pstmt.executeUpdate();

            System.out.println("Data inserted successfully.");

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

查询数据

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

public class ClickHouseQueryExample {
    public static void main(String[] args) {
        String url = "jdbc:clickhouse://localhost:8123/default";
        String user = "default";
        String password = "";

        try (Connection conn = DriverManager.getConnection(url, user, password)) {
            // 查询数据
            String querySQL = "SELECT * FROM my_table WHERE id = ? AND timestamp >= ? AND timestamp < ?";
            PreparedStatement pstmt = conn.prepareStatement(querySQL);
            pstmt.setLong(1, 1);
            pstmt.setString(2, "2023-10-01 00:00:00");
            pstmt.setString(3, "2023-10-02 00:00:00");

            ResultSet rs = pstmt.executeQuery();
            while (rs.next()) {
                long id = rs.getLong("id");
                String timestamp = rs.getString("timestamp");
                double value = rs.getDouble("value");
                System.out.println("id: " + id + ", timestamp: " + timestamp + ", value: " + value);
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

精彩专栏推荐订阅:在下方专栏👇🏻
✅ 2023年华为OD机试真题(A卷&B卷)+ 面试指导
✅ 精选100套 Java 项目案例
✅ 面试需要避开的坑(活动)
✅ 你找不到的核心代码
✅ 带你手撕 Spring
✅ Java 初阶

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

推荐一款高效的内存清理工具:MemoryCleaner

MemoryCleaner是一款高效的内存清理工具&#xff0c;旨在优化您的计算机性能。它利用Windows内置的多种功能&#xff0c;能够在不影响系统运行的情况下&#xff0c;自动释放内存。用户可以通过系统托盘直接访问MemoryCleaner的功能&#xff0c;无需打开程序&#xff0c;使得内存…

MySQL分区表(二)

说明&#xff1a;之前有写过一篇博客&#xff0c;介绍MySQL如何建立分区表&#xff0c;本文介绍如何建立子分区表。子分区&#xff0c;就是在原来分区的基础上&#xff0c;再嵌套一个分区。 例如&#xff0c;按照记录的创建时间分区&#xff0c;在此基础上&#xff0c;再按照租…

ssm043基于JavaEE的龙腾公司员工信息管理系统的设计与实现+jsp(论文+源码)_kaic

毕 业 设 计&#xff08;论 文&#xff09; 题目&#xff1a;龙腾公司员工信息管理系统设计与实现 摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本龙腾公司…

使用 PyCharm 构建 FastAPI 项目:零基础入门 Web API 开发

使用 PyCharm 构建 FastAPI 项目&#xff1a;零基础入门 Web API 开发 本文提供了一份完整的 FastAPI 入门指南&#xff0c;涵盖从环境搭建、依赖安装到创建并运行一个简单的 FastAPI 应用的各个步骤。通过 FastAPI 和 Uvicorn&#xff0c;开发者可以快速构建现代化的 Web API…

<项目代码>YOLOv8 夜间车辆识别<目标检测>

YOLOv8是一种单阶段&#xff08;one-stage&#xff09;检测算法&#xff0c;它将目标检测问题转化为一个回归问题&#xff0c;能够在一次前向传播过程中同时完成目标的分类和定位任务。相较于两阶段检测算法&#xff08;如Faster R-CNN&#xff09;&#xff0c;YOLOv8具有更高的…

centos7.X zabbix监控参数以及邮件报警和钉钉报警

1&#xff1a;zabbix安装 1.1 zabbix 环境要求 硬件配置: 2个CPU核心, 4G 内存, 50G 硬盘&#xff08;最低&#xff09; 操作系统: Linux centos7.2 x86_64 Python 2.7.x Mariadb Server ≥ 5.5.56 httpd-2.4.6-93.el7.centos.x86_64 PHP 5.4.161.2 zabbix安装版本 [rootnod…

类(4)

1.拷贝构造函数 我们在创建对象得的时候&#xff0c;可否创造一个与已存在对象一摸一样的对象呢&#xff1f; 拷贝构造函数&#xff1a;只有单个形参&#xff0c;该形参是对本类类型对象的引用&#xff08;一般常用const修饰&#xff09; 用在已存在的类类型对象创建新对象时…

‌【元素周期表】氢

化学式&#xff1a;H₂ 外观&#xff1a;无色透明 分子量&#xff1a;2.01588 吸入少量氢气对人体没有危害&#xff0c;甚至还可能对人体有益。但是不能吸入大量氢气&#xff0c;否则可能会对身体造成影响。 氢在生活中的主要用途包括以下几个方面‌&#xff1a; ‌医疗保健…

【06】A-Maven项目SVN设置忽略文件

做Web项目开发时&#xff0c;运用的是Maven管理工具对项目进行管理&#xff0c;在项目构建的过程中自动生成了很多不需要SVN进行管理的文件&#xff0c;SVN在对源码进行版本管理时&#xff0c;需要将其忽略&#xff0c;本文给出了具体解决方案。 SVN设置忽略Maven项目中自动生成…

【Windows】X-DOC:无需NAS使用Windows也能安装Jellyfin玩私人影音媒体平台

【Windows】X-DOC&#xff1a;无需NAS使用Windows也能安装Jellyfin玩私人影音媒体平台 1、前言2、Jellyfin服务搭建2.1 Jellyfin简介2.2 Jellyfin下载2.3 Jellyfin安装2.4 Jellyfin设置2.5 Jellyfin使用 3、终端访问3.1 浏览器访问 4、内网穿透 1、前言 下载收藏高清电影、电视…

海的记忆篇章:海滨学院班级回忆录项目

摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了海滨学院班级回忆录的开发全过程。通过分析海滨学院班级回忆录管理的不足&#xff0c;创建了一个计算机管理海滨学院班级回忆录的方案。文章介绍了海滨学院班级回…

Unity 使用Netcode实现用户登录和登出

Unity之NetCode for GameObjets 基本使用 说明思路相关API代码实现Tips 说明 最近项目需要联机&#xff0c;项目方案选用Unity提供的NetCode for GameObjets&#xff08;以下简称NGO&#xff09;&#xff0c;踩了不少坑&#xff0c;本文不介绍基础使用&#xff0c;围绕双端&…

C++(类和对象-运算符重载)

运算符重载概念&#xff1a; 对已有的运算符重新进行定义&#xff0c;赋予其另一种功能&#xff0c;以适应不同的数据类型 运算符重载的同时也可以发生函数重载 1.加号运算符重载 1.1加号运算符重载的本质 1.2运算符重载也可以发生函数重载 总结1&#xff1a;对于内置的数据类型…

Flink CDC 同步 Mysql 数据

文章目录 一、Flink CDC、Flink、CDC各有啥关系1.1 概述1.2 和 jdbc Connectors 对比 二、使用2.1 Mysql 打开 bin-log 功能2.2 在 Mysql 中建库建表准备2.3 遇到的坑2.4 测试 三、番外 一、Flink CDC、Flink、CDC各有啥关系 Flink&#xff1a;流式计算框架&#xff0c;不包含 …

Sigrity Power SI VR noise Metrics check模式如何进行电源噪声耦合分析操作指导

SSigrity Power SI VR noise Metrics check模式如何进行电源噪声耦合分析操作指导 Sigrity Power SI的VR noise Metrics check模式本质上是用来评估和观测器件的电源网络的耦合对于信号的影响,输出S参数以及列出具体的贡献值。 以下图为例

Vue computed watch

computed watch watch current prev

恋爱脑学Rust之智能指针Rc,RefCell和Weak指针

小明和小丽为了维系彼此的关系&#xff0c;一起探索了智能指针的奥秘。通过 Rc、RefCell 和 Weak 的帮助&#xff0c;他们得以克服情感中遇到的种种困境。 第一章&#xff1a;Rc 智能指针的共生 小明和小丽搬进了一个共同的小屋&#xff0c;他们彼此相爱&#xff0c;决定共用…

Matlab车牌识别课程设计报告(附源代码)

Matlab车牌识别系统 分院&#xff08;系&#xff09; 信息科学与工程 专业 学生姓名 学号 设计题目 车牌识别系统设计 内容及要求&#xff1a; 车牌定位系统的目的在于正确获取整个图像中车牌的区域&#xff0c; 并识别出车牌号。通过设计实现车牌识别系…

Java 文件操作与IO流

文件 文件有两个概念&#xff0c;在广义来看就是操作系统上对硬件和软件资源抽象为文件。 在侠义上来看&#xff0c;就是我们保存在硬盘上的文件 在这里我们讨论的是狭义的文件&#xff0c;在外面的硬盘上的文件细分又可以分为二进制文件和文本文件&#xff0c;文本文件可以通…

C++ 优先算法 —— 有效三角形的个数(双指针)

目录 题目&#xff1a;有效三角形个数 1. 题目解析 2. 算法原理 解法一&#xff1a; 暴力枚举 解法二&#xff1a; 双指针算法 3. 代码实现 暴力枚举 双指针算法 题目&#xff1a;有效三角形个数 1. 题目解析 题目截图&#xff1a; 题目的意思就是在一个数组中&#x…